29

我在 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 个表连接到一个表中?

4

3 回答 3

60

使用显式JOIN而不是隐式,以下应该得到你想要的,尽管奇怪的是你的隐式连接语法首先没有返回正确的结果。我已经使用LEFT JOIN, 来说明没有关联艺术家或专辑的歌曲,但这对于您的数据集可能不是必需的,INNER JOIN可以使用 an 来代替。

我还添加了列别名以消除获取行时的歧义,因为在大多数表中都有相似的列名 ( 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
于 2012-07-04T01:32:24.260 回答
1

试试这个选择,可能Artists比其他人更重要,所以从Songs低谷ArtistsAlbumsSongs

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改用。

于 2015-10-06T14:26:37.350 回答
0

试试 sql 内连接

           inner join Artists on Songs.artist_id = Artists._id
于 2012-07-04T01:39:42.257 回答