MySQL搜索查询 - 从标签搜索:(

时间:2010-06-21 18:32:31

标签: mysql query-optimization

所以,我有一个允许用户提交代码的webapp。提交内容存储在code表中,其中几列是全文索引。这就是我到目前为止一直在进行搜索的方式。

但是,用户可以使用他们喜欢的标签提交他们的提交内容 - 我也希望这些标签也包含在搜索中(但是,所有这些都在一个查询中...)。标签存储在表tags中,并且有一个名为code_tags的交集表,用于存储code_idtag_id。标准的东西。

我的'旧'搜索查询是这样的:

SELECT *
  FROM code
 WHERE MATCH (title, summary, code) AGAINST ('$searchterm')

$searchterm是通过PHP $ _POST获取的。

所以我试着写一些'高级'查询:

SELECT code.*, 
       code_tags.*, 
       tags.*, 
       tags.tag
  FROM code, code_tags, tags
 WHERE code_tags.code_id = code.id
   AND tags.id = code_tags.tag_id
   AND MATCH (title, summary, code) AGAINST ('$searchterm') 

但所有这一切都是回归...... 没有。即使输入了完全有效的搜索词。

所以我评论了最后一行:

SELECT code.*, code_tags.*, tags.*, tags.tag
  FROM code, code_tags, tags
 WHERE code_tags.code_id = code.id
   AND tags.id = code_tags.tag_id
-- AND MATCH (title, summary, code) AGAINST ('php') 

这将返回数据库中的每个提交。但是,同一行重复多次,因为它有标记(唯一的区别是,每个返回行中的标记)。

E.G:

Query Fail http://i48.tinypic.com/2m5z80m.png

所以,终于,我以为我会很聪明并且GROUP_CONCAT标签:

SELECT code.*, code_tags.*, tags.*, GROUP_CONCAT(tags.tag SEPARATOR ' ') AS taggroup
  FROM code, code_tags, tags
 WHERE code_tags.code_id = code.id
   AND tags.id = code_tags.tag_id
-- AND MATCH (title, summary, code, taggroup) AGAINST ('php')`

这有两个很大的问题。

  1. 注释掉最后一个AND MATCH行,只返回一行(包含code表中第一个条目的所有详细信息 - 并且标记组列出每个提交的每个标记!
  2. 包含上一个AND MATCH行,我收到以下错误:Unknown column 'taggroup' in 'where clause' - 该死的!
  3. 那么,我打算做什么? :S

2 个答案:

答案 0 :(得分:0)

不确定如何同时选择tags.*GROUP_CONCAT但是我现在使用MySQL已经有一段时间了,无论如何加入你的数据并按你想要的列分组。示例如下。

SELECT code.id, code.title, GROUP_CONCAT(tags.tag SEPARATOR ' ')
  FROM code
 INNER JOIN code_tags ON code.id = code_tags.code_id
 INNER JOIN tags ON code_tags.tag_id = tags.id
 WHERE MATCH (code.title, code.summary, code.code) AGAINST ('php')
 GROUP BY code.id, code.title

答案 1 :(得分:0)

以下原因:

SELECT code.*, code_tags.*, tags.*, tags.tag
  FROM code, code_tags, tags
 WHERE code_tags.code_id = code.id
   AND tags.id = code_tags.tag_id
   AND MATCH (title, summary, code) AGAINST ('php') 

...不返回任何结果是您没有任何code表记录,其标题/摘要/代码与“php”匹配且与CODE_TAGS或{有关系{1}}表。切换到ANSI-92 JOIN语法,请尝试:

TAGS

如果没有返回任何内容,那么您的问题是,满足全文搜索的记录都不会与SELECT c.*, ct.* FROM CODE c JOIN CODE_TAGS ct ON ct.code_id = c.id WHERE MATCH (title, summary, code) AGAINST ('php') 表中的任何内容相关 - 您需要先添加关联才能生效。如果将JOIN添加到TAGS表会影响任何事情,那么这应该会有所启发:

CODE_TAGS