我有多对多数据库,我有一个查询,我刚刚被卡住了,无法执行。
我有4张table艺术家、曲目、专辑、剪辑
现在我在艺术家页面上,所以我需要通过艺术家页面获得它们,我已经得到了所有的,但不是我想要的方式。
因为有些曲目、专辑、剪辑也属于其他艺术家(二重唱),我需要显示他们的名字。
但问题是,我选择使用艺术家id,所以我的GROUPC_CONCAT函数在这里不起作用。
SELECT al.album_name, GROUP_CONCAT(a.artist_name SEPARATOR ', ') AS 'artist_name'
FROM
Albums al
LEFT JOIN
ArtistAlbums art ON art.album_id = al.album_id
LEFT JOIN
Artists a on a.artist_id = art.artist_id
WHERE
a.artist_id = 10
GROUP BY
al.album_id
其中一张专辑附有两位艺术家,但没有另一位艺术家的名字。
当我按albumid选择时,我得到了两位艺术家。
请注意,我是mysql的新手,在这个特定问题上没有找到任何答案,几乎没有关于多对多查询的资源。
我该如何解决这个问题。?
任何关于多对多的资源或书籍,如果能展示如何在应用层上处理数据库,我们将不胜感激。
1条答案
按热度按时间h43kikqp1#
将表别名视为真正的行别名。也就是说,对于WHERE子句和选择列表中的表达式,别名一次引用一行。
因为您已经创建了
a.artist_id = 10
这样的条件,所以只有该艺术家的行与条件匹配。你真正想要的是匹配一张专辑中的所有艺术家,因为一个艺术家是artist_id=10。为此,您需要另一个连接,以便artist_id=10的行与相应专辑的所有行匹配。
附言:我还将您使用的LEFT JOIN替换为INNER JOIN。你没有理由需要LEFT JOIN,因为你明确地寻找有匹配艺术家的专辑,而不是所有专辑,无论它是否有艺术家10。Review the meaning of different types of join.
关于后续问题:
我不知道有哪本书专门针对多对多的查询。我推荐的书有: