mysql - 如何使用中间表选择相似的项目?
问题描述
根据一些建议,我将一个表分为 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 的动漫,并按常见类型的数量对它们进行排序。
解决方案
- 寻找你想要找到相似之处的动漫的genre_id。
- 检查哪些动漫与这些genre_id匹配
- 数数并排序
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 |
推荐阅读
- c# - 如何展平表格或连接行?
- powershell - PowerShell:如何获取管道收集的计数?
- python - 我对对象和类感到困惑
- python-2.7 - Radare2/r2pipe 二进制写入模式
- node.js - TypeError:无法读取未定义 gm 库的属性“宽度”
- python - 升级到 mac os catalina 后,Pickle 负载无法正常工作
- c# - 尝试在 2D 中拾取和投掷物体
- c# - 发布-订阅设计模式如何建立组件之间的松散耦合?C#
- php - 如何将子文件夹控制器包含到 laravel 中的其他控制器中
- javascript - 单击处理程序在 Jquery POST 后不起作用