-1

我有一张专辑的 ID,我想从他们的艺术家的专辑中获取所有曲目。一张专辑有很多曲目。一首曲目有许多制作人(艺术家)。

MySQL 结构

数据库结构

问题

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

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

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

4

6 回答 6

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
于 2013-05-15T08:36:20.930 回答
0

您可以而且应该使用纯 MySQL 做到这一点,拥有三个表,将它们与外键链接,并使用 JOIN 进行查询。

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

于 2013-05-15T08:37:24.257 回答
0

您只能使用LEFT JOINmysql 来实现此目的:

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 = ? 
于 2013-05-15T08:38:37.527 回答
0

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

它应该看起来像: select t.*, some_aggregate_function(a.whatever) from Tracks t left join Produced p on (t.trac_id = p.produced_id) left join Artist a on (p.produced_artist = a.artist_id) group by t .*

于 2013-05-15T08:41:42.913 回答
0

了解SQL 连接

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 = ?
于 2013-05-15T08:36:21.547 回答
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;

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

于 2013-05-15T08:36:58.650 回答