【问题标题】:SQL query to get count and account details from another table用于从另一个表中获取计数和帐户详细信息的 SQL 查询
【发布时间】:2021-07-16 04:40:59
【问题描述】:

我有这些表:

歌曲

id,album_id, name, 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 如果这会有所不同

【问题讨论】:

    标签: sql count left-join


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

      我也试过了:

      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 子句中或用于聚合函数中

      这是因为您缺少 GROUP BY 子句中的新字段。你可以这样修复它:

      SELECT s.id,
             acc.first_name,
             acc.last_name,
             acc.display_picture_url,
             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,
               acc.first_name,
               acc.last_name,
               acc.display_picture_url
      ORDER BY COUNT(ls.id) DESC
      

      【讨论】:

      • 是的,我知道,但我想知道将它们包含在 group by 中是否很好,idk 为什么它可以是自动的...寻找一种更合乎逻辑的方法,但我会用它作为最后的手段thx
      猜你喜欢
      • 1970-01-01
      • 2018-04-30
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 2021-09-26
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多