项目
| 项目ID|项目名称|
| - -----|- -----|
| 一个|脆|
| 2|微笑|
| 3|精灵|
艺术家
| 艺术家_id|艺术家姓名|
| - -----|- -----|
| 一个|丽莎·辛普森|
| 2|约翰·史密斯|
| 3|莎莉·温特|
积分
| credit_id|贷方名称|
| - -----|- -----|
| 一个|生产者|
| 2|声乐家|
| 3|作家|
| 4|搅拌机|
歌曲
| 歌曲ID|歌名|项目ID|
| - -----|- -----|- -----|
| 二十三|你好|一个|
| 十二岁|古迪|3|
| 三十|蝴蝶|2|
| 五十五|棒棒糖|一个|
混音
| 混音ID|混音名称|项目ID|
| - -----|- -----|- -----|
| 十个|你好(Extended Mix)|一个|
| 二十二|好的(坏的混音)|3|
| 三十一|Butterfly(Sugar Remix)|2|
| 四十五|棒棒糖(电台混音)|一个|
Credit_To_Artist
| 自体|credit_id|艺术家_id|歌曲ID|混音ID|
| - -----|- -----|- -----|- -----|- -----|
| 一个|一个|一个|二十三|零|
| 一个|一个|一个|零|十个|
| 一个|一个|一个|五十五|零|
| 一个|一个|一个|零|四十五|
| 一个|3| 2|二十三|零|
| 一个|3| 3|十二岁|零|
| 一个|3| 3|三十|零|
| 一个|一个|一个|三十|零|
| 一个|一个|一个|零|三十一|
我想按字母顺序显示一个项目列表,显示有多少歌曲或混音,特定的艺术家计数。
我想要实现的输出是这样的:(艺术家ID = 1)
| 艺术家_id|项目ID|项目名称|歌曲计数|再混合计数|总计|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 一个|一个|脆|2| 2| 4|
| 一个|2|微笑|一个|一个|2|
哪一个查询可以实现此结果?我已经尝试了下面的查询,它可以得到歌曲的总数,但它不适用于remixcount,我不知道如何将它们加在一起得到总数。
先谢谢你。
SELECT a.artist_id, p.project_id, p.project_name,
COUNT(DISTINCT c2a.song_id) as songcount,
COUNT(DISTINCT c2a.remix_id) as remixcount
FROM `Project` p
LEFT JOIN `Song` s ON s.project_id = p.project_id
LEFT JOIN `Remix` rm ON rm.project_id = p.project_id
LEFT JOIN `Credit_To_Artist` c2a ON c2a.song_id = s.song_id
INNER JOIN `Artist` a ON a.artist_id = c2a.artist_id
WHERE c2a.artist_id = 1
GROUP BY p.project_id
ORDER BY p.project_name ASC
1条答案
按热度按时间jv2fixgn1#
这个问题非常微妙,因为当你有聚合,并且有很多表要连接时,很容易搞砸,因为第一个(错误的)冲动行为是将所有表连接在一起,然后直接粘贴计数,这并不是最好的方法。
以下是我会遵循的心理过程:
COALESCE(r.project_id, s.project_id)
只使用一个字段作为项目ID。完成这些步骤后,您可以最终应用聚合,而聚合字段为:
COUNT(song_id)
:歌曲数量,COUNT(remix_id)
:再混合的量,COUNT(song_id) + COUNT(remix_id)
:合计而你的非聚合字段,应该放在
GROUP BY
子句中,是:COALESCE(r.project_id, s.project_id)
,即统一项目ID以下是完整的查询:
最后一个
ORDER BY
子句完全是可选的。只是为了视觉化。输出:
| 艺术家_id|项目ID|歌曲计数|再混合计数|总计|项目名称|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 一个|一个|2| 2| 4|脆|
| 一个|2|一个|一个|2|微笑|
| 2|一个|一个|0|一个|脆|
| 3| 2|一个|0|一个|微笑|
查看演示here。