我有 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/