【问题标题】:Mysql - Help me alter this search query to get desired resultsMysql - 帮助我更改此搜索查询以获得所需的结果
【发布时间】:2011-03-03 01:58:40
【问题描述】:

以下是回答理解系统所需的表格和数据的转储:-

系统由导师和班级组成。 表 All_Tag_Relations 中的数据存储每个注册的导师和导师创建的每个班级的标签关系。标签关系用于搜索类。

CREATE TABLE IF NOT EXISTS `Tags` (
  `id_tag` int(10) unsigned NOT NULL auto_increment,
  `tag` varchar(255) default NULL,
  PRIMARY KEY  (`id_tag`),
  UNIQUE KEY `tag` (`tag`),
  KEY `id_tag` (`id_tag`),
  KEY `tag_2` (`tag`),
  KEY `tag_3` (`tag`),
  KEY `tag_4` (`tag`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

INSERT INTO `Tags` (`id_tag`, `tag`) VALUES
(1, 'Sandeepan'),
(2, 'Nath'),
(3, 'first'),
(4, 'class'),
(5, 'new'),
(6, 'Bob'),
(7, 'Cratchit');


CREATE TABLE IF NOT EXISTS `All_Tag_Relations` (
  `id_tag` int(10) unsigned NOT NULL default '0',
  `id_tutor` int(10) default NULL,
  `id_wc` int(10) unsigned default NULL,
  KEY `All_Tag_Relations_FKIndex1` (`id_tag`),
  KEY `id_wc` (`id_wc`),
  KEY `id_tag` (`id_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `All_Tag_Relations` (`id_tag`, `id_tutor`, `id_wc`) VALUES
(1, 1, NULL),
(2, 1, NULL),
(3, 1, 1),
(4, 1, 1),
(6, 2, NULL),
(7, 2, NULL),
(5, 2, 2),
(4, 2, 2),
(8, 1, 3),
(9, 1, 3);

以下是我的查询:-

此查询搜索“first class”(标签表中 first = 3 和 class= 4 的标签)并返回所有这些类,使得类名中同时存在术语 first 和 class。

SELECT wtagrels.id_wc,SUM(DISTINCT( wtagrels.id_tag =3)) AS
       key_1_total_matches,
       SUM(DISTINCT( wtagrels.id_tag =4))                AS
       key_2_total_matches
FROM   all_tag_relations AS wtagrels
WHERE  ( wtagrels.id_tag =3
          OR wtagrels.id_tag =4 )
GROUP  BY wtagrels.id_wc
HAVING key_1_total_matches = 1
       AND key_2_total_matches = 1
LIMIT  0, 20  

它返回 id_wc = 1 的类。

但是,我希望搜索显示所有这些课程,以便所有搜索词都出现在课程名称或其导师名称中 因此,搜索“Sandeepan 类”(wtagrels.id_tag = 1,4)或“Sandeepan Nath”也会返回 id_wc=1 的类。和搜索。搜索“Bob First”不应返回任何类。

请修改上述查询或建议一个新查询,如果可能的话使用 MyIsam - 全文搜索,但以某种方式帮助我获得结果。

【问题讨论】:

  • 10 个问题,0 个答案。请更改该费率。
  • Sev 是对的。如果您不接受答案,没有人愿意帮助您。
  • 我还没有得到解决我问题的确切答案。如果我只是随机接受答案,它将如何帮助其他人?但是,我对有用或导致积极方向的答案竖起大拇指。所以请帮忙,好的答案会提高你的声誉

标签: mysql search tags join


【解决方案1】:

我认为这个查询会对您有所帮助:

SET @tag1 = 1, @tag2 = 4; -- Setting some user variables to see where the ids go. (you can put the values in the query)

SELECT wtagrels.id_wc,
  SUM(DISTINCT( wtagrels.id_tag =@tag1 OR wtagrels.id_tutor =@tag1)) AS key_1_total_matches,
  SUM(DISTINCT( wtagrels.id_tag =@tag2 OR wtagrels.id_tutor =@tag2)) AS key_2_total_matches
FROM   all_tag_relations AS wtagrels
WHERE  ( wtagrels.id_tag =@tag1 OR wtagrels.id_tag =@tag2 )
GROUP  BY wtagrels.id_wc
HAVING key_1_total_matches = 1 AND key_2_total_matches = 1
LIMIT  0, 20

它返回id_wc = 1
对于 (6, 3),查询不返回任何内容。

【讨论】:

  • 是的,这肯定更接近,但 id_wc = 1 也应该返回 (1,2)。谢谢
  • 为什么?因为id_wcNULL,其中id_tagid_tutor 是1 和2。
  • 是的,因此我知道。所以可能需要一些适当的加入或其他什么?就像我说的那样,搜索“Sandeepan Nath”应该显示 id_wc =1 因为 id_tags 1 和 2 反对 id_tutor = 1 这是该课程的导师。我只是不知道该怎么做。
  • 我不明白。但是对于标签 (1,4) 为什么 id_wc 是 1,因为 id_wcNULL 对于 id_tag=1
  • id_wc 为NULL,因为是导师姓名对应的导师标签关系,与班级无关。但是在搜索时,我们需要将课程与导师联系起来,这样即使所有关键字都与特定导师匹配,该导师的所有课程都应显示在结果中,在此示例中,id_wc = 1 是该导师的唯一课程。我们必须使用数据进行操作才能得到结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2020-11-19
  • 2018-08-15
  • 2017-10-16
相关资源
最近更新 更多