mysql多对多查询问题

j2cgzkjk  于 2022-10-22  发布在  Mysql
关注(0)|答案(1)|浏览(178)

我有多对多数据库,我有一个查询,我刚刚被卡住了,无法执行。
我有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的新手,在这个特定问题上没有找到任何答案,几乎没有关于多对多查询的资源。
我该如何解决这个问题。?
任何关于多对多的资源或书籍,如果能展示如何在应用层上处理数据库,我们将不胜感激。

h43kikqp

h43kikqp1#

将表别名视为真正的行别名。也就是说,对于WHERE子句和选择列表中的表达式,别名一次引用一行。
因为您已经创建了a.artist_id = 10这样的条件,所以只有该艺术家的行与条件匹配。你真正想要的是匹配一张专辑中的所有艺术家,因为一个艺术家是artist_id=10。
为此,您需要另一个连接,以便artist_id=10的行与相应专辑的所有行匹配。

SELECT  al.album_name, GROUP_CONCAT(a2.artist_name SEPARATOR ', ') AS `artist_name`
FROM 
  Albums al
INNER JOIN 
  ArtistAlbums art ON art.album_id = al.album_id
INNER JOIN 
  Artists a on a.artist_id = art.artist_id
INNER JOIN 
  ArtistAlbums art2 ON art2.album_id = al.album_id
INNER JOIN 
  Artists a2 on a2.artist_id = art2.artist_id
WHERE 
  a.artist_id = 10
GROUP BY 
  al.album_id

附言:我还将您使用的LEFT JOIN替换为INNER JOIN。你没有理由需要LEFT JOIN,因为你明确地寻找有匹配艺术家的专辑,而不是所有专辑,无论它是否有艺术家10。Review the meaning of different types of join.
关于后续问题:
我不知道有哪本书专门针对多对多的查询。我推荐的书有:

相关问题