首页 > 解决方案 > 用于从另一个表中获取计数和帐户详细信息的 SQL 查询

问题描述

我有这些表:

歌曲

id、album_id、名称、audio_url

专辑

id、标题、描述、account_id

帐户

id、first_name、last_name、display_picture_url

Listening_Session

id、song_id、account_id

我希望能够列出以下流行歌曲:

歌曲ID | 歌曲名称 | 名字 | 姓氏 | 显示图片网址 | 会话计数

基本上,我想列出歌曲及其作者姓名和显示图片,以及启动了多少个会话来收听这首歌(无论作者或其他用户收听它),按会话数降序排列。

我试过了:

SELECT s.*, pc.account_id, first_name, last_name, display_picture_url
FROM song as s
LEFT JOIN album a ON s.id = s.album_id
LEFT JOIN accounts acc ON acc.id = s.account_id
WHERE s.is_deleted = false AND s.id IN (
    SELECT s.id FROM song s
LEFT JOIN listening_sessions ls ON ls.song_id = s.id
WHERE s.is_deleted = false GROUP BY s.id
    ORDER BY count(s.id) DESC
    )

但我认为我会丢失 ORDER BY 计数,因为它在子查询中并且也无法获得会话计数

我也试过:

SELECT s.*, COUNT(ls.id)
FROM song as s
LEFT JOIN listening_sessions ls ON ls.song_id = s.id
LEFT JOIN album a ON a.id = s.album_id
LEFT JOIN accounts acc ON acc.id = pc.account_id
GROUP BY s.id
ORDER BY count(ls.id) DESC

这会起作用,但如果我尝试包含 first_name、last_name 和 display_picture_url,它会说:

错误:列“acc.first_name”必须出现在 GROUP BY 子句中或在聚合函数中使用

编辑:我在我的表中实现了主键,但没有外键以方便当前使用,idk 如果这有所作为

标签: sqlcountleft-join

解决方案


SELECT TMP1.*, TMP2.account_id, TMP2.first_name, TMP2.last_name, TMP2.display_picture_url
FROM (
    SELECT s.*, COUNT(ls.id) AS Cnt
    FROM song as s
    LEFT JOIN listening_sessions ls ON ls.song_id = s.id
    LEFT JOIN album a ON a.id = s.album_id
    LEFT JOIN accounts acc ON acc.id = pc.account_id
    GROUP BY s.id
) TMP1
LEFT JOIN accounts TMP2 ON TMP1.account_id = TMP2.id

推荐阅读