mysql 对同一个表中的两列进行计数,然后将两者都计为总计

bfhwhh0e  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(125)

项目

| 项目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
jv2fixgn

jv2fixgn1#

这个问题非常微妙,因为当你有聚合,并且有很多表要连接时,很容易搞砸,因为第一个(错误的)冲动行为是将所有表连接在一起,然后直接粘贴计数,这并不是最好的方法。
以下是我会遵循的心理过程:

  • 首先,你要考虑拥有所有ID的主表,即“credit_to_artist”。您会注意到歌曲和混音是在交错的唱片上找到的,我们将它们关联在一起的唯一方法是通过项目ID。
  • 因此,我们需要“song”表中的歌曲项目ID,以及“remix”表中的混音项目ID。我们应用相应的两个左连接。我们可以使用COALESCE(r.project_id, s.project_id)只使用一个字段作为项目ID。
  • 然后,您注意到还需要项目名称,因此添加了一个连接操作,以从“project”表中收集项目名称。

完成这些步骤后,您可以最终应用聚合,而聚合字段为:

  • COUNT(song_id):歌曲数量,
  • COUNT(remix_id):再混合的量,
  • COUNT(song_id) + COUNT(remix_id):合计

而你的非聚合字段,应该放在GROUP BY子句中,是:

  • “* 艺术家_id*”
  • COALESCE(r.project_id, s.project_id),即统一项目ID
  • “* 项目名称 *”

以下是完整的查询:

SELECT cta.artist_id,
       COALESCE(r.project_id, s.project_id)   AS project_id,
       p.project_name                         AS project_name,
       COUNT(cta.song_id)                     AS song_count,
       COUNT(cta.remix_id)                    AS remix_count,
       COUNT(cta.song_id)+COUNT(cta.remix_id) AS total
FROM      credit_to_artist cta
LEFT JOIN remix r
       ON cta.remix_id = r.remix_id
LEFT JOIN song s
       ON s.song_id = cta.song_id
INNER JOIN project p
        ON COALESCE(r.project_id, s.project_id) = p.project_id
GROUP BY cta.artist_id,
         COALESCE(r.project_id, s.project_id),
         p.project_name
ORDER BY artist_id, project_id

最后一个ORDER BY子句完全是可选的。只是为了视觉化。

输出

| 艺术家_id|项目ID|歌曲计数|再混合计数|总计|项目名称|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 一个|一个|2| 2| 4|脆|
| 一个|2|一个|一个|2|微笑|
| 2|一个|一个|0|一个|脆|
| 3| 2|一个|0|一个|微笑|
查看演示here

相关问题