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

MYSQL:如何使用多个标记进行选择,mysql,Mysql,我有三张这样的桌子 艺术家 [ artist_id | artist_name | ... ] 流派 [ genre_id | genre_name | ... ] [ artist_genre_artist_id | artist_genre_genre_id | ... ] 艺术家流派 [ genre_id | genre_name | ... ] [ artist_genre_artist_id | artist_genre_genre_id | ... ] 艺术家(如皇后)有多

我有三张这样的桌子

艺术家

[ artist_id | artist_name | ... ]
流派

[ genre_id | genre_name | ... ]
[ artist_genre_artist_id | artist_genre_genre_id | ... ]
艺术家流派

[ 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;
这里的策略是在给定的连接表记录匹配连接两侧的类型的条件下,将每个艺术家与其他艺术家进行比较(无重复)。然后,我们通过被比较的艺术家对进行聚合,并获取记录的数量,即重叠。下面是一个小样本数据集的工作演示:

将上述结果存储在数组$related\u genre中

SELECT DISTINCT artist.artist_name FROM artist_genre
LEFT JOIN artist
ON artist.artist_id = artist_genre.artist_genre_artist_id
WHERE artist_genre.artist_genre_genre_id   in ($related_genre);