2011-09-19 125 views
2

我有许多到很多的数据库,我有一个查询,我只是被困住了,不能做到这一点。mysql多对多查询问题

我有4个表艺术家曲目专辑剪辑

现在我的艺术家页面上,所以我需要由艺术家页面,让他们,我已经得到了所有他们,但不是我想要他们的方式。

因为一些曲目,专辑,剪辑也属于其他艺术家(二重奏),我需要显示他们的名字。

但问题是,我选择使用艺术家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 

其中一个专辑有两个艺术家附加到它,但它没有得到其他艺术家的名字。

当我选择album_id我得到了两位艺术家。

请注意,我是mysql新手,在这个特定问题上我没有找到任何答案,几乎没有多对多查询的资源。

我该如何解决这个问题。

任何有关如何处理应用程序层数据库的多对多资源或书籍将不胜感激, 预先感谢。

+0

你已经明确表示去取什么艺术家的数据('a.artist_id = 10'),所以你会得到结果了该艺术家,不是为别人 –

+0

是啊,我也说,这是我是问题有,我怎么能得到它的工作。 – ParparDromi

回答

3

将表别名想象为真的是行别名。也就是说,为了WHERE子句和选择列表中的表达式,别名一次引用单个行。

由于您创建的条件为a.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 

P.S .:我也用你的INNER JOIN替代了你使用的LEFT JOIN。没有理由,你需要LEFT JOIN,因为你明确地寻找具有匹配的艺术家的专辑,不是所有的专辑无论它是否具有艺术家10 Review the meaning of different types of join.


重新您的后续问题:

我不知道一本关于多对多查询的书。我推荐这样的书:

+1

嘿,我写了这个确切答案的中途 - 你击败了我的拳头=) –

+1

我感谢我的速度,我在高中的触摸式老师威尔科克斯太太。 :-) –

+0

谢谢,我得问你会推荐多少对多本书?! – ParparDromi