所以,我有一个允许用户提交代码的webapp。提交内容存储在code
表中,其中几列是全文索引。这就是我到目前为止一直在进行搜索的方式。
但是,用户可以使用他们喜欢的标签提交他们的提交内容 - 我也希望这些标签也包含在搜索中(但是,所有这些都在一个查询中...)。标签存储在表tags
中,并且有一个名为code_tags
的交集表,用于存储code_id
和tag_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')`
这有两个很大的问题。
AND MATCH
行,只返回一行(包含code
表中第一个条目的所有详细信息 - 并且标记组列出每个提交的每个标记!AND MATCH
行,我收到以下错误:Unknown column 'taggroup' in 'where clause'
- 该死的!那么,我打算做什么? :S
答案 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