我在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
并且它给出了不正确的结果(每首歌中的每首歌都重复,尽管艺术家是正确的)。如何修复查询语句以将3个表连接到单个表中?
答案 0 :(得分:39)
使用显式的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 :(得分:1)
尝试此选择,Artists
可能比其他人更重要,因此Songs
来自Artists
来自Albums
和Songs
。
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
。
答案 2 :(得分:0)
尝试sql内连接
inner join Artists on Songs.artist_id = Artists._id