在SQLite数据库中连接3个表

32

我在SQLite数据库中有3个表:

Songs:

_id | name | length | artist_id (foreign key) | album_id (foreign key)

艺术家:

_id | name

相册:

_id | name

我需要一个查询语句(在Android应用中使用),查询的是一个包含以下列的表:

_id | name | length | artist_id | artist_name | album_id | album_name

然而,我编写了以下的查询语句:

SELECT Songs._id, Songs.name, Songs.length, Songs.artist_id, Artists.name, Songs.album_id, Albums.name FROM Songs, Artists, Albums WHERE Songs.artist_id = Artists._id AND Songs.album_id = Albums._id

但是它给了我一个空表。我尝试使用 OR 代替 AND 并且它给出了错误的结果(每首歌在每个专辑中都重复,尽管艺术家是正确的)。如何修正我的查询语句以将这3个表连接到单个表中?

3个回答

64

使用显式 JOIN 而不是隐式连接,下面的代码应该能够得到你想要的结果,尽管奇怪的是,你的隐式连接语法在第一次没有返回正确的结果。我使用了 LEFT JOIN 来解决那些没有关联艺术家或专辑的歌曲,但这在你的数据集中可能并不需要,可以改用 INNER JOIN

此外,我还添加了列别名来消除在大多数表中具有相似列名 (id, name) 时的歧义。

SELECT
  Songs._id AS song_id,
  Songs.name AS song_name, 
  Songs.length, 
  Songs.artist_id AS artist_id, 
  Artists.name AS artist_name, 
  Songs.album_id AS album_id, 
  Albums.name AS album_name
FROM 
 Songs 
 LEFT JOIN Artists ON Songs.artist_id = Artists._id
 LEFT JOIN Albums ON Songs.album_id = Albums._id

1
我刚刚也在写同样的东西。但是,如果一首歌没有艺术家或专辑的标签,他可能需要使用LEFT JOIN - mawburn
非常好用,非常感谢。谢谢 :) - Eng.Fouad
@MuhammadBabar 你可能误用了GROUP BY。你应该将其作为一个不同的问题发布。 - Michael Berkowski
相同的问题 http://stackoverflow.com/questions/32537345/how-to-join-more-than-one-tables-using-id-sqlite - Aditya
1
与“选择*”相反?在生产代码中,我从来不建议使用“SELECT *”; 我认为明确总是更好。但是,您可以将连接的一个表别名而不是另一个表,省去一些打字:SELECT songs.id AS song_id, songs.name AS song_name, artist.* FROM...但是,您必须知道列“id”指的是“artist.id”,而“name”是“artist.name”。您无法为表中的所有列提供“全局”别名前缀。我从未见过支持任何类似功能的RDBMS(尽管可能存在),也不符合标准SQL。 - Michael Berkowski
显示剩余4条评论

4

尝试使用此选择器,也许艺术家比其他人更重要,因此歌曲通过艺术家专辑歌曲中传递。

SELECT
  Songs._id AS song_id,
  Songs.name AS song_name, 
  Songs.length, 
  Songs.artist_id AS artist_id, 
  Artists.name AS artist_name, 
  Songs.album_id AS album_id, 
  Albums.name AS album_name
FROM 
 Artists
 LEFT JOIN Songs ON Songs.artist_id = Artists._id
 LEFT JOIN Albums ON Songs.album_id = Albums._id

此外,如果在Songs中没有属于特定艺术家的条目,或者在Albums中没有属于特定歌曲的条目,由于使用了LEFT JOIN,你仍然会得到艺术家的条目。如果只想返回有歌曲和专辑的艺术家,请使用JOIN


0

尝试使用 SQL 内连接

           inner join Artists on Songs.artist_id = Artists._id

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接