在SQLite数据库中join3个表

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

歌曲:

_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 ,它给出了不正确的结果(虽然艺术家是正确的,但是每张专辑中的每首歌都是重复的)。 我怎样才能解决我的查询语句join一个表中的3个表?

Solutions Collecting From Web of "在SQLite数据库中join3个表"

使用一个显式的JOIN而不是一个隐式的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 

试试这个select,可能是Artists比别人更重要的,所以SongsSongs ArtistsAlbums走出来。

 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

尝试SQL内部连接

  inner join Artists on Songs.artist_id = Artists._id