SQL索引/关系(SQL index/relation)

编程入门 行业动态 更新时间:2024-10-27 18:31:52
SQL索引/关系(SQL index/relation)

我正在索引帖子的两件事。 一个是标题(单词),两个是关键字。 我选择使用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有关。 这样做的好方法是什么?

I'm indexing two things of posts. One is the title (words) and two are the keywords. I've chosen to use 3 tables for this:

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

Now I'm trying to perform a decent search query on this. Using the keywords only, it works fine.

  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
 

But now I would like to include word_rel to also search in the title.

I tried this, but it doesn't sound right and also doesn't return everything (missing some of 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
 

The problem is with INNER JOIN post p which is related to keyword_rel. Now I also need it related to word_rel. What is a good way to do this ?

最满意答案

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

You would need to do a UNION here:

  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
 

And since this may return some of the results twice or more times (especially if the word is contained in both keywords and titles), You may want to wrap the above query into another SELECT DISTINCT:

SELECT DISTINCT t.post_id, t.word
FROM (
    SELECT ...
    UNION
    SELECT
) t
ORDER BY t.word ASC

                    
                     
          

更多推荐

本文发布于:2023-07-14 20:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1107334.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:索引   关系   SQL   index   relation

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!