mysql - 计算不同表中的条件
问题描述
我有 4 个表(歌曲、专辑和两个关系表)。
我有两个需要合并的查询:
-问题 1)
SELECT l.name_language, count(s.id_song)
FROM language as l
LEFT JOIN song_has_languages as s ON l.id_language = s.id_language
GROUP BY l.id_language
HAVING COUNT(s.id_song) > 0
ORDER BY name_language ASC
输出:
name_language | songs
English | 5
Spanish | 1
-问题 2)
SELECT l.name_language, count(a.id_album)
FROM language as l
LEFT JOIN album_has_languages as a ON l.id_language = a.id_language
GROUP BY l.id_language
HAVING COUNT(a.album)> 0
ORDER BY name_language ASC
输出:
name_language | albums
English | 5
French | 2
我的目标是这个输出:
name_language | total |
English | 10 |
Spanish | 1 |
French | 2 |
我只想打印带有歌曲或专辑的语言。
解决方案
你可以做你想做的事情union all
和聚合:
select l.name_language, sum(num_songs + num_albums) as total
from language l left join
((select shl.id_language, count(*) as num_songs, 0 as num_albums
from song_has_languages shl
group by shl.id_language
) union all
(select ahl.id_language, 0 as num_songs, count(*) as num_albums
from album_has_languages ahl
group by ahl.id_language
)
) sa
on sa.id_language = l.id_language
group by l.id_language, l.name_language;
你也可以用LEFT JOIN
s 来表达:
select l.name_language,
( coalesce(num_songs, 0) + coalesce(num_albums, 0) ) as total
from language l left join
(select shl.id_language, count(*) as num_songs
from song_has_languages shl
group by shl.id_language
) shl
on shl.id_language = l.id_language left join
(select ahl. id_language, count(*) as num_albums
from album_has_languages ahl
group by ahl.id_language
) ahl
on ahl.id_language = l.id_language;
推荐阅读
- sql - 在Oracle SQL中按字符数拆分字符串
- python - 如何为其他方法封装类方法
- angular - 有没有办法从组件中的 db 值添加角度指令?
- java - JNI - 如何获取 Double.toString() 方法以将 jdouble 转换为 jstring
- node.js - 在 AWS ec2 实例上部署 Node Express 应用程序和 php 应用程序的最佳实践
- php - 从对象 php laravel 获取数据
- git - Git:制作一个由当前分支的更改组成的 PR,该更改取决于另一个分支的更改
- transactions - Spring重试期间如何根据线程增加Atomikos默认jta超时
- django - 自定义的 django all-auth 表单未提交
- c# - 如何将列中的二进制数据转换为文件?