通过连接表获取许多行

时间:2013-05-15 08:32:30

标签: php mysql

我有一张专辑的ID,我想从他们的艺术家那里获得专辑的所有曲目。 相册有很多曲目曲目有很多制片人(艺术家)。

MySQL结构

Database structure

问题

我不知道我是否可以在完整的mySQL中完成它,或者我是否应该添加一些PHP。

编辑:我的问题不够明确。问题不在于使用联接表进行查询,而是使用艺术家列表获取曲目。您可以使用group_concat处理它。

教程: http://www.mysqlperformanceblog.com/2006/09/04/group_concat-useful-group-by-extension/

6 个答案:

答案 0 :(得分:2)

这取决于您需要的数据。如果您对艺术家更感兴趣,那么您可以将专辑和艺术家的曲目加入曲目。这将为您提供每位艺术家的记录。

SELECT
    ar.*
FROM albums AS al
JOIN tracks AS t
    ON t.album_id = al.album_id
JOIN produced AS p
    ON p.produced_track = t.track_id
JOIN artists AS ar
    ON ar.artist_id = p.produced_artist

如果你对曲目更感兴趣,只需要列出艺术家然后进行相同的连接,但在艺术家名称上使用group_concat,按曲目ID使用

SELECT
    t.*,
    GROUP_CONCAT(DISTINCT ar.name ORDER BY ar.name SEPARATOR ', ') AS artists
FROM albums AS al
JOIN tracks AS t
    ON t.album_id = al.album_id
JOIN produced AS p
    ON p.produced_track = t.track_id
JOIN artists AS ar
    ON ar.artist_id = p.produced_artist
GROUP BY t.track_id

答案 1 :(得分:0)

了解SQL joins

SELECT *
FROM   Tracks
  JOIN Produced ON Produced.produced_track = Tracks.track_id
  JOIN Artists  ON Artists.artist_id = Produced.produced_artists
WHERE  Tracks.track_album = ?

答案 2 :(得分:0)

最好只在纯SQL中执行此操作:

SELECT * 
FROM albums al
LEFT JOIN tracks tr ON (tr.ttack_album = al.album_id)
LEFT JOIN produced pr ON (pr.produced_track = tr.track_id)
LEFT JOIN artists ar ON (ar.artist_id = pr.produced_artist)
WHERE al.album_id = thealbumid;

但是,根据您需要使用数据的方式,没有什么可以阻止您进行单独的查询。

答案 3 :(得分:0)

你可以,你应该用纯MySQL做,有三个表,用外键链接,用JOIN查询。

你不需要PHP来重载工作,MySQL可以很好地处理它:)

答案 4 :(得分:0)

您可以使用LEFT JOIN仅使用mysql实现此目的:

SELECT * FROM Albums a
LEFT JOIN Tracks b
ON a.album_id = b.track_album
LEFT JOIN Produced c
on b.track_id = c.produced_track
LEFT JOIN Artist d
on c.produced_artist = d.artist_id
WHERE a.album_id = ? 

答案 5 :(得分:0)

您可以使用聚合函数和分组子句在SQL中执行此操作。

应该看起来像:     选择t。*,            some_aggregate_function(a.whatever)     来自Tracks t     左连接生成p on(t.trac_id = p.produced_id)     左连接艺术家a(p.produced_artist = a.artist_id)     按t。*分组。