sql - 用于从另一个表中获取计数和帐户详细信息的 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 如果这有所作为
解决方案
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
推荐阅读
- javascript - 在 Javascript 中更改光标类型
- javascript - PrimeFaces PolarArea Chart - GridLine 颜色变化
- t4 - 仅在 linq2db 中使用 T4Model 为选定表生成 POCO 类
- ios - iPad pro 无法全屏打开我的应用程序
- swift - 如何在 Firebase 数据库中保存日期?[迅速]
- sql - 如何在 SQLite 中添加外键?
- python - Colab 不工作。TypeError:图像数据无法转换为浮点数
- c++ - 在 C++ 中迭代和创建日期和时间
- python - 自定义启动指令以触发谷歌助手
- python - 在缺失数字中插入 1 的问题