【问题标题】:Join 3 tables in SQLite database在 SQLite 数据库中加入 3 个表
【发布时间】:2025-12-16 11:50:02
【问题描述】:

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

【问题讨论】:

    标签: android sql database sqlite join


    【解决方案1】:

    使用显式的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
    

    【讨论】:

    • 我只是在写同样的东西。但是,他可能需要LEFT JOIN,以防一首歌没有艺术家或专辑的标签。
    • @MadBurn 只是改变了这一点
    • 效果很好。非常感谢。谢谢:)
    • 如果我只加入 1 个表,我的选择中有 group_concat 一切正常,但另一个加入搞砸了整个查询记录正在重复。
    • @NiiLaryea 相对于SELECT *?我永远不会真正推荐在生产代码中使用SELECT *;我认为最好总是明确的。但是您可以为连接的一个表而不是另一个表设置别名,从而节省一些输入:SELECT songs.id AS song_id, songs.name AS song_name, artist.* FROM...,但是您必须知道列id 指的是artist.id,而nameartist.name。您不能为表中的所有列提供“全局”别名前缀。我从未见过支持类似的 RDBMS(尽管可能存在),而且它不是标准 SQL。
    【解决方案2】:

    试试这个选择,可能Artists 比其他人更重要,所以Songs 来自SongsArtistsAlbums

    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

    【讨论】:

      【解决方案3】:

      尝试 sql 内连接

                 inner join Artists on Songs.artist_id = Artists._id
      

      【讨论】: