MYSQL:如何使用多个标签进行选择

标签 mysql

我有 3 张 table 是这样设置的

艺术家

[ artist_id | artist_name | ... ]

类型

[ genre_id | genre_name | ... ]

艺术家流派

[ artist_genre_artist_id | artist_genre_genre_id | ... ]

艺术家(例如皇后乐队)有多种流派,例如摇滚、华丽摇滚、迷幻摇滚、硬摇滚、前卫摇滚、朋克摇滚、重金属、流行、布鲁斯、摇滚、节奏布鲁斯.

如果我访问The Rolling Stone等其他艺术家的页面,我想根据当前艺术家的多个流派(标签)显示类似queen的艺术家。

滚石乐队的音乐风格包括摇滚、蓝调、摇滚

我想按照当前艺术家的流派出现在其他艺术家列表中的数量,按照相关性的顺序返回结果。

我不知道我是否说得足够有道理,但我希望你能明白我的意思。谢谢!

最佳答案

我们可以尝试使用聚合的自连接方法:

SELECT
    a1.artist_name,
    a2.artist_name,
    COUNT(*) AS common_cnt
FROM artist_genre ag1
INNER JOIN artist_genre ag2
    ON ag2.artist_genre_artist_id > ag1.artist_genre_artist_id AND
       ag2.artist_genre_genre_id = ag1.artist_genre_genre_id
INNER JOIN artist a1
    ON a1.artist_id = ag1.artist_genre_artist_id
INNER JOIN artist a2
    ON a2.artist_id = ag2.artist_genre_artist_id
GROUP BY
    a1.artist_name,
    a2.artist_name
ORDER BY
    COUNT(*) DESC,
    a1.artist_name,
    a2.artist_name;

这里的策略是将每个艺术家与其他每个艺术家进行比较(不重复),条件是给定的连接表记录与连接两侧的流派相匹配。然后,我们对被比较的艺术家进行聚合,并获取记录的数量,这就是重叠。这是一个带有小样本数据集的工作演示:

Demo

关于MYSQL:如何使用多个标签进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59099315/

相关文章:

MySQL从具有相同主键的另一个表中更新完整列数据(3000万行)

MySQL 连接从所有位置返回计数(报告),即使数字为零

mysql - 使用 WHERE 子句过滤融合表查询

java - 无法使用 java jdbc 驱动程序连接到 Mysql

javascript - 谷歌地图 API V3 :Make marker move automatically

php - 尝试检查某些数字 mysql php 之间的值

mysql - 将 LAMP 应用程序移植到 EC2

php - Eloquent 中的连接查询按相关表排序不太有效

mysql - Connection.query 函数被跳过并且不在 if 语句中执行

mysql - 通过增量更新 MySQL - Rails