加入3个表所需的线索

时间:2012-04-23 17:40:10

标签: mysql join

这似乎应该很容易,但我没有设法创建正确的查询或找到一个等效的情况。假设我有3个我想加入的表:ArtistAlbumTrack。 (实际上我没有这些表,但我正在使用的表具有相同的关系。)

每个artist可以有多个album,每个album可以有多个track

artist表已在artist_id上编入索引,其中包含有关艺术家的信息(nameaddressphone number等。

album表已在artist_idalbum_id上编入索引。它包含相册的名称和其他信息(recording datelocation等)。

track表已在artist_idalbum_idtrack_nbr上编入索引。它包含曲目的名称,长度等。

我要做的是创建一个如下所示的报告:

Artist|Album|Track#|Track Name
The Wizard of Frobozz|Zork I|01|The White House
The Wizard of Frobozz|Zork I|02|Eaten by a Grue
The Wizard of Frobozz|Zork I|03|Take the Sword
The Wizard of Frobozz|Zork I|04|Don't Forget the Lantern
The Wizard of Frobozz|Zork II|01|Waiting for the Volcano Gnome
The Wizard of Frobozz|Zork II|02|On the Left Bank of Zork
The Wizard of Frobozz|Zork II|03|In the Oddly Angled Room

我可以加入artistalbum表来获取所有albums但是当我添加track表时,我只得到一个trackalbum - artist组合。

这似乎应该可行,但不会:

select a.name, l.album, t.track_nbr, t.track_name
from track t, album l, artist a 
where t.artist_id = l.artist_id
and l.artist_id = a.artist_id
and t.album_id = a.album_id
order by a.name, l.album, t.track_nbr;

我的猜测是我需要显式声明一个连接并可能添加括号来对连接进行分组,但是我无法找到我可以完全理解的文档来执行此操作。

所以......帮帮忙?谢谢!

3 个答案:

答案 0 :(得分:2)

 SELECT a.name, l.album, t.track_nbr, t.track_name
 FROM artist a
 LEFT JOIN album l ON a.artist_id = l.artist_id
 LEFT JOIN track t ON t.album_id = a.album_id
 ORDER BY a.name, l.album, t.track_nbr;

与数据库设计相关的问题:为什么artist_id表中有trackartist_id已通过此曲目所属的album定义。

答案 1 :(得分:1)

select a.name,
    l.album,
    t.track_nbr,
    t.track_name
from track t
inner join album l on t.album_id = l.album_id
inner join artist a on l.artist_id = a.artist_id
order by a.name,
    l.album,
    t.track_nbr;

答案 2 :(得分:1)

不应该这样:

and t.album_id = a.album_id

其实是这个吗?

and t.album_id = l.album_id

另外,我相信第三个WHERE子句比实际需要的多。我认为这就是诀窍:

select a.name, l.album, t.track_nbr, t.track_name
from track t, album l, artist a 
where t.album_id = l.album_id
and l.artist_id = a.artist_id
order by a.name, l.album, t.track_nbr;

当你说专辑表在album_id和artist_id上编入索引时,你究竟是什么意思?您是否在artist_id表的主键中包含album?这是多余的,因为您已在album_id中拥有唯一值。