Как составить sql запрос с созданием нескольких групп из связанной таблицы?

Нужно получить количество файлов форматов cdr и dxf для каждой записи таблицы table1. и найти записи для которых есть 2 cdr файла и 4 dxf файла.

create table table1
(
   id int, 
   name varchar(255)
);
create table table2
(
   id int,
   table1_id int,
   filename varchar(255),
   filetype varchar(255)
);
insert into table1 (id,name) values
(123, 'name123'),
(124, 'name124'),
(125, 'name125'),
(126, 'name126'),
(127, 'name127'),
(128, 'name128')
insert into table2 (id,table1_id,filename,filetype) values
(1, 123, 'file1', 'cdr'),
(2, 123, 'file1', 'dxf'),
(3, 123, 'file2', 'cdr'),
(4, 123, 'file2', 'dxf'),
(5, 123, 'file3', 'dxf'),
(6, 123, 'file4', 'dxf'),
(7, 124, 'file11', 'cdr'),
(8, 124, 'file11', 'dxf'),
(9, 124, 'file12', 'cdr'),
(10, 124, 'file12', 'dxf')
select * from table1
 id | name   
--: | :------
123 | name123
124 | name124
125 | name125
126 | name126
127 | name127
128 | name128
select * from table2
id | table1_id | filename | filetype
-: | --------: | :------- | :-------
 1 |       123 | file1    | cdr     
 2 |       123 | file1    | dxf     
 3 |       123 | file2    | cdr     
 4 |       123 | file2    | dxf     
 5 |       123 | file3    | dxf     
 6 |       123 | file4    | dxf     
 7 |       124 | file11   | cdr     
 8 |       124 | file11   | dxf     
 9 |       124 | file12   | cdr     
10 |       124 | file12   | dxf     
-- пример рабочего запроса. но в нем только по типу cdr ищется.

SELECT table1.id, count(table2.filetype) as cdrCount
FROM table1
INNER JOIN table2 ON table1.id = table2.table1_id
WHERE table2.filetype = 'cdr'
GROUP BY table2.table1_id, table2.filetype
HAVING COUNT(table2.filetype) = 2
 id | cdrCount
--: | -------:
123 |        2
124 |        2
-- ЭТОТ ЗАПРОС НЕ РАБОТАЕТ

-- Ожидаемый результат:
-- ----------------------------
-- | id  | cdrCount | dxfCount |
-- |-----|----------|----------|
-- | 123 |    2     |    4     |  
-- -----------------------------

SELECT table1.id, count(t21.filetype) as cdrCount, count(t22.filetype) as dxfCount
FROM table1
INNER JOIN table2 t21 ON table1.id = t21.table1_id
INNER JOIN table2 t22 ON table1.id = t22.table1_id
WHERE t21.filetype = 'cdr' AND t22.filetype = 'dxf'
GROUP BY t21.table1_id, t21.filetype, t22.table1_id, t22.filetype
HAVING COUNT(t21.filetype) = 2 AND COUNT(t22.filetype) = 4
id | cdrCount | dxfCount
-: | -------: | -------:

db<>fiddle here


Ответы (1 шт):

Автор решения: Akina
SELECT table1.id, 
       SUM(table2.filetype = 'cdr') as cdrCount, 
       SUM(table2.filetype = 'dxf') as dxfCount
FROM table1
INNER JOIN table2 ON table1.id = table2.table1_id
WHERE table2.filetype IN ('cdr', 'dxf')
GROUP BY table1.id
HAVING cdrCount = 2 AND dxfCount = 4

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=715fbae08974ee0d5308d42bcf2fdcfb

→ Ссылка