0

我正在索引两篇文章。一个是标题(单词),两个是关键字。为此,我选择使用 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. 什么是这样做的好方法?

4

1 回答 1

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

并且由于这可能会返回某些结果两次或更多次(特别是如果该词同时包含在关键字和标题中),您可能希望将上述查询包装到另一个中SELECT DISTINCT

SELECT DISTINCT t.post_id, t.word
FROM (
    SELECT ...
    UNION
    SELECT
) t
ORDER BY t.word ASC
于 2013-10-23T14:53:59.913 回答