首页 > 解决方案 > 如何使用中间表选择相似的项目?

问题描述

根据一些建议,我将一个表分为 3 个部分,以使用多对多查询,所以现在我有了:

表动漫:

+----------------+-------------+
| id             | title       |
+----------------+-------------+
| 1              | Anime A     |
| 2              | Anime B     |
| 3              | Anime C     |
+----------------+-------------+

Tabela de 流派:

+----------------+-------------+
| id             | genre       |
+----------------+-------------+
| 1              | Action      |
| 2              | Romance     |
| 3              | Ninja       |
+----------------+-------------+

然后是中间动画和流派的第三张表:

+----------------+-------------+
| anime_id       | genre_id   |
+----------------+-------------+
| 1              | 1           |
| 1              | 3           |
| 2              | 2           |
| 2              | 3           |
| 3              | 2           |
+----------------+-------------+

给定一个动漫 ID,可以获得如下类型:

SELECT an.id, an.title, GROUP_CONCAT(g.genre) AS genres
    FROM animes an 

    INNER JOIN intermediate_table ti ON ti.anime_id = an.id

    INNER JOIN genres g ON g.id = ti.genre_id

WHERE an.id = 1

那么,如果我想根据常见类型的数量来获取相似动漫的列表,我应该怎么查询呢?就像我想知道所有类似于动漫 1 的动漫,并按常见类型的数量对它们进行排序。

小提琴示例

标签: mysqlselect

解决方案


  1. 寻找你想要找到相似之处的动漫的genre_id。
  2. 检查哪些动漫与这些genre_id匹配
  3. 数数并排序

SQL 演示

SELECT anime_id , COUNT(F.genre_id)
FROM anime_genre A
LEFT JOIN ( SELECT `genre_id`
            FROM `anime_genre`
            WHERE `anime_id` = 1 ) F
       ON A.`genre_id` = F.`genre_id`   
WHERE  `anime_id` <> 1    
GROUP BY anime_id 
HAVING COUNT(F.genre_id) > 0
ORDER BY COUNT(F.genre_id) DESC

输出

我添加了一个额外的动画来显示它们的相似程度

| anime_id | COUNT(F.genre_id) |
|----------|-------------------|
|        4 |                 2 |
|        2 |                 1 |

推荐阅读