Посчитать с условиями в разных таблицах - PullRequest
0 голосов
/ 10 июня 2019

У меня есть 4 таблицы (песни, альбомы и две таблицы отношений).

У меня есть 2 запроса, которые мне нужно объединить:

- ЗАПРОС 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          

- QUERY 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     | 

Я хочу печатать только языки с песней или альбомом.

1 Ответ

0 голосов
/ 10 июня 2019

Вы можете делать что хотите с 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...