【问题标题】:MYSQL many-to-many relationship questionsMYSQL多对多关系问题
【发布时间】:2020-04-04 19:49:05
【问题描述】:

以下是我的表格结构:

posts table:
---------------------
|id|title|body|etc..|
---------------------

tags table:
---------------
|id|name|etc..|
---------------

post_tag table (the pivot table):
-------------------
|id|post_id|tag_id|
-------------------

如您所见,许多帖子可以有许多标签,反之亦然。我要问的是如何根据它们有多少共同标签来查询相关帖子? 例如,如果我有一些类似以下的帖子:

  1. 这是一篇带有标签的帖子:#sql、#nosql、#database
  2. 这是带有标签的两个帖子:#sql、#nosql
  3. 这是带有标签的第三个帖子:#database
  4. 这是带有标签的第四篇文章:#stackoverflow

如何查询与帖子 1 相关(具有共同标签)的帖子,并根据它们的共同标签数量对结果进行排序?我尝试了以下查询:

SELECT p.* 
FROM posts p 
INNER JOIN post_tag pt ON p.id = pt.post_id 
INNER JOIN tags t on pt.tag_id = t.id 
WHERE t.id IN (
    SELECT t.id 
    FROM tags t 
    INNER JOIN post_tag pt ON t.id = pt.tag_id 
    INNER JOIN posts p ON pt.post_id = p.id 
    WHERE p.id = ?
) AND p.id != ? LIMIT 8

它有效,但如果帖子共享多个标签,则会返回重复项。另外,我不知道如何根据它们共有的标签数量对结果进行排序。仅此而已,在此先感谢您!

【问题讨论】:

    标签: mysql sql join mariadb many-to-many


    【解决方案1】:

    您可以像这样简化查询:

    SELECT post_tag.post_id
    FROM post_tag
    WHERE post_tag.post_id <> 1 AND post_tag.tag_id IN (
        SELECT tag_id
        FROM post_tag
        WHERE post_id = 1
    )
    GROUP BY post_tag.post_id
    ORDER BY COUNT(post_tag.tag_id) DESC
    LIMIT 8
    

    如有必要,将结果与帖子表连接起来。

    【讨论】:

      【解决方案2】:

      您可以按如下方式加入和聚合:

      select p1.id, p2.id, count(*) nb_tags_in_common
      from posts p1
      inner join post_tag pt1 on pt1.post_id = p1.id
      inner join post_tag pt2 on pt2.tag_id = pt1.tag_id
      inner join posts p2 on p2.id = pt2.post_id
      group by p1.id, p2.id
      order by count(*) desc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-10
        • 2021-07-18
        • 1970-01-01
        • 2021-09-14
        • 2015-07-09
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多