我正在为帖子的两件事建立索引。一是标题(单词),二是关键词。为此,我选择使用 3 个表:
word_index (word,word_id) // al words and keywords are indexed
keyword_rel (word_id,postId) // relations with the keywords
word_rel (word_id,postId) // relations with the the words of the title
现在我正在尝试对此执行适当的搜索查询。仅使用关键字,效果很好。
SELECT p.postId
FROM word_index wi
INNER JOIN keyword_rel kr ON wi.word_id=kr.word_id
INNER JOIN post p ON p.postId=kr.postId
WHERE wi.word LIKE 'input%'
GROUP BY p.postId
但现在我想包含 word_rel
来在标题中进行搜索。
我尝试了这个,但听起来不对,而且也没有返回所有内容(缺少一些 wi.word):
SELECT p.postId,wi.word
FROM word_index wi
INNER JOIN keyword_rel kr ON wi.word_id=kr.word_id
INNER JOIN word_rel wr ON wi.word_id = wr.word_id
INNER JOIN post p ON p.postId=kr.postId
INNER JOIN post pi ON pi.postId=wr.postId
WHERE wi.word LIKE 'input%'
GROUP BY p.postId
问题出在 INNER JOIN post p
上,它与 keyword_rel
相关。现在我还需要与 word_rel
相关的内容。有什么好的方法可以做到这一点?
最佳答案
您需要在这里进行 UNION:
SELECT p.postId, wi.word
FROM word_index wi
INNER JOIN keyword_rel kr ON wi.word_id = kr.word_id
INNER JOIN post p ON p.postId=kr.postId
WHERE wi.word LIKE 'input%'
GROUP BY p.postId
UNION
SELECT p.postId, wi.word
FROM word_index wi
INNER JOIN word_rel wr ON wi.word_id = wr.word_id
INNER JOIN post p ON p.postId=wr.postId
WHERE wi.word LIKE 'input%'
GROUP BY p.postId
并且由于这可能会返回某些结果两次或更多次(特别是如果单词同时包含在关键字和标题中),您可能需要将上述查询包装到另一个选择不同的
:
SELECT DISTINCT t.post_id, t.word
FROM (
SELECT ...
UNION
SELECT
) t
ORDER BY t.word ASC
关于php - SQL索引/关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19544577/