【问题标题】:(SQL) Getting a column for every ID out of a junction table(SQL) 从联结表中获取每个 ID 的列
【发布时间】:2022-01-22 18:49:50
【问题描述】:

[如果这个问题已经在其他地方得到回答,我会很感激地把这个链接删除]

我有一个播放列表:

pid | name 

1   | playlist 1 
2   | playlist 2
3   | playlist 3

还有一张歌单:

sid | name 

1   | song 1 
2   | song 2
3   | song 3

他们与这个联结表有联系:

pid | sid 

1   | 1 
1   | 2
1   | 3
2   | 2 
3   | 1

我已经设法让加入工作

SELECT      playlists.pid, songs.*
FROM        playlists
INNER JOIN  playlist_contains_song
ON          playlists.pid = playlist_contains_song.pid
INNER JOIN  songs
ON          playlist_contains_song.sid = songs.sid;

这给了我这个结果:

pid | sid | name 

1   | 1   | song 1    
1   | 2   | song 2
1   | 3   | song 3    
2   | 2   | song 2    
3   | 1   | song 1

现在我想知道是否有办法“水平”获取这些数据。 首选输出应如下所示:

pid | 1 | 2 | 3

1   | 1 | 1 | 1
2   | 0 | 1 | 0
3   | 1 | 0 | 0

列是 sid,值代表真或假,无论歌曲是否在播放列表中。

提前致谢!

【问题讨论】:

    标签: sql postgresql join select junction-table


    【解决方案1】:

    使用透视查询:

    SELECT pid,
           COUNT(*) FILTER (WHERE sid = 1) AS "1",
           COUNT(*) FILTER (WHERE sid = 2) AS "2",
           COUNT(*) FILTER (WHERE sid = 3) AS "3"
    FROM playlist_contains_song
    GROUP BY pid
    ORDER BY pid;
    

    【讨论】:

    • 谢谢,有没有办法动态完成这项工作?事实上,有成千上万首歌曲——如果可能的话,这是否值得推荐?或者我应该使用连接选择给我的表,然后在 python/pandas 中完成其余的工作?
    • 嗯,您当然可以从 Python 构建查询字符串(并且应该很明显您将如何添加,例如,第四首歌曲的列)。如果您必须从 Postgres 执行此操作,请查看交叉表查询。
    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多