SQL索引/关系

时间:2013-10-23 14:29:35

标签: php mysql sql

我正在索引帖子的两件事。一个是标题(单词),两个是关键字。我选择使用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 pkeyword_rel有关。现在我还需要它与word_rel相关。有什么好办法呢?

1 个答案:

答案 0 :(得分:0)

你需要在这里做一个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

由于这可能会将某些结果返回两次或更多次(特别是如果 word 包含在关键字和标题中),您可能希望将上述查询包装到另一个{{1 }}:

SELECT DISTINCT