【问题标题】:Joining multiple tables and display all names linked from id加入多个表并显示从 id 链接的所有名称
【发布时间】:2018-03-20 04:38:06
【问题描述】:

我已经使用我学到的正常形式重建了我的数据库,但现在我无法将它们与所有表重新组合在一起。

我有一个歌曲数据库,表的连接是这样链接的:

songs          artists            song_vocals         song_composers
--------------------------------------------------------------------
song_id        artist_id          song_id             song_id
title          artist_name        artist_id           artist_id

有多个表,其外键指向艺术家表。

我想用这样的名字显示所有信息,我不想通过 id 显示它们:

song_id        title         vocal          composer
--------------------------------------------------------
1              ABC           John           Cat

到目前为止,我能做的最好的事情就是加入 3 个表,这只会给我 song_idtitlevocal

SELECT songs.song_id, songs.title, artists.artist_name as vocal FROM songs
LEFT JOIN song_vocals ON
song_vocals.song_id = songs.song_id
left join artists ON
song_vocals.artist_id = artists.artist_id

我怎样才能加入更多?

【问题讨论】:

    标签: sql phpmyadmin foreign-keys jointable


    【解决方案1】:

    如果您还没有这样做,您可以为作曲家创建一个表,并将外键添加到您的 song_vocals 表中,无论如何,从您的语句中该表就是您的主表。然后,您可以在艺术家之后向作曲家表添加另一个左连接,但不要忘记将 composers.composer_name (我假设)也放在您的 select 语句中。

    【讨论】:

    • song_composers 表已经创建,它引用了艺术家表的名称。如果我要创建另一个作曲家表来存储名称,那么这将是名称的冗余问题,因为我已经将它们存储在艺术家表中。
    • 您仍然可以将作曲家表与艺术家表左连接,但在 select 语句中为名称提供不同的别名,这样您就不会感到困惑。您还可以通过创建名称表并将名称 id 存储在艺术家和作曲家表中来进一步规范艺术家表,这样您最终会得到 2 个引用名称表的联结表,但这可能会适得其反,因为我们没有了解您的情况和数据库架构的全貌。
    【解决方案2】:

    song_vocals 和 song_composer 表有什么区别

    【讨论】:

    • song_vocals 存储歌曲的歌手,而 song_composer 存储歌曲的作曲家。可以有多个歌手演唱同一首歌,也可以有多个作曲家写一首歌。
    【解决方案3】:
    SELECT 
    songs.title as SongTitle,
    a1.artist_name as Vocal,
    a2.artist_name as Composer
    FROM songs
    left join song_vocals ON song_vocals.song_id = songs.song_id
    left join artists a1 ON song_vocals.artist_id = a1.artist_id
    left join song_composers on songs.song_id = song_composers.song_id
    left join artists a2  on a2.artist_id = song_composers.artist_id
    

    这是您应该使用的代码块。 如果您有两个或多个指向某个表的链接,并且使用 ALIAS,则可以多次使用该表。 在你的前任。 "a1","a2" 是你的别名

    【讨论】:

    • 谢谢它的工作。我还有一个问题,比如多位歌手演唱的歌曲,现在选择多行显示,怎么合并成一行?
    • 为此,您需要使用动态 sql,以便您可以一个接一个地添加名称,举一个小例子,您必须编写一个查询,如 @vocal = @vocal+' '+@vocal2跨度>
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多