MariaDB: group by не считает записи

#mysql #group-by #union

#mysql #группировка по #объединение

Вопрос:

 (select a.id, b.gamesyouth b.gamesadult as numofgames
from tusplayer a, tusplayerbasic b
where a.id = b.playerid and b.gamesyouth b.gamesadult > 400)
union all
(select a.id, count(*) as numofgames
from tusplayer a, tuslineup b, tusgames c
where a.id = b.playerid and b.fussballdeid = c.fussballdeid and c.kickoff > '2020-10-14'
group by a.id)
order by id
 

он выбирает количество игр из 2 разных таблиц.
Он возвращает что-то вроде:

 id           numofgames             
187          3                      
188          623                    
188          3                      
189          3                      
190          700                    
190          3 

                 
 

Так, например, идентификаторы 188 и 190 содержат 2 записи, 187 и 189 — только одну.

Теперь я хочу иметь полную сумму для обеих таблиц по идентификатору. SQL:

 select id, numofgames from ((select a.id, b.gamesyouth b.gamesadult as numofgames
from tusplayer a, tusplayerbasic b
where a.id = b.playerid and b.gamesyouth b.gamesadult > 400)
union all
(select a.id, count(*) as numofgames
from tusplayer a, tuslineup b, tusgames c
where a.id = b.playerid and b.fussballdeid = c.fussballdeid and c.kickoff > '2020-10-14'
group by a.id)
order by id) as rotz
group by rotz.id
 

Но он возвращает только

 id           numofgames             
187          3                      
188          623                    
189          3                      
190          700  
 

188 должно быть 626, а 190 должно быть 703.

Где ошибка?

Ответ №1:

 SELECT id, sum(x)
FROM tableA
GROUP BY id
UNION ALL
SELECT id, sum(x)
FROM tableB
GROUP BY id
 

Приведет к 2 строкам, потому что это то, что UNION ALL делает.
Если вам нужен только один итог, вам нужно будет сделать:

 SELECT id, sum(x)
FROM (
   SELECT id, sum(x) as x
   FROM tableA
   GROUP BY id
   UNION ALL
   SELECT id, sum(x)
   FROM tableB
   GROUP BY id
) y
GROUP BY id
 

Ответ №2:

Вы пропустили сумму :

select id, sum(numofgames) ...

Использование group by без агрегатной функции (count, sum, mean …) просто выберет одну строку для каждой группы.

https://mariadb.com/kb/en/group-by/

Комментарии:

1. О, спасибо, это работает! Но почему я должен это делать в качестве дополнительной суммы ()? Разве group-by не предназначен для подсчета нескольких записей?

2. Использование group by без агрегатной функции (count, sum, mean …) просто выберет одну строку для каждой группы. mariadb.com/kb/en/group-by

3. Пожалуйста, добавьте некоторые пояснения к вашему ответу , чтобы другие могли извлечь из него уроки