Count в связке с group_by

123
03 июля 2019, 10:40

Подскажите почему такие неожиданные результаты выдает запрос?

Таблица user

+----+-------+
| id | name  |
+----+-------+
| 1  | admin |
+----+-------+

Таблица address

+---------+-------+
| user_id | addrr |
+---------+-------+
|    1    | addr1 |
+---------+-------+
|    1    | addr2 |
+---------+-------+

Запрос:

SELECT COUNT(user.id) AS count 
FROM user 
LEFT JOIN address ON user.id = address.user_id 
WHERE user_id = 1 
GROUP BY user.id
[count] => 2

Почему count = 2 а не 1, GROUP BY же группирует все по идентификатору пользователя? Например, если запустить такой запрос:

SELECT user.id 
FROM user 
LEFT JOIN address ON user.id = address.user_id 
WHERE user_id = 1 
GROUP BY user.id;
[id] => 1

То ожидаемо появится только один id. Если их этого запроса убрать GROUP BY, то ответ без сюрпризов: [id] => 1 [id] => 1.

Если добавить DISTINCT, то все подсчитывается как и задумывалось:

SELECT COUNT(DISTINCT(user.id)) AS count 
FROM user 
LEFT JOIN address ON user.id = address.user_id 
WHERE user_id = 1 
GROUP BY user.id
[count] => 1

Получается, что сначала подсчитывается COUNT() а только потом группируется с помощью GROUP BY?

Answer 1

Простите за ответ скриншотами, но автора по другому убедить не выйдет, в комментариях я ему написал текстом =)

Мы с автором вопроса пришли к некому согласию по входным данным, теперь ответ на вопрос:

  • Сначало происходит склейка таблиц(JOIN).
  • Следом происходит группировка(Group By).
  • После этого идет подсчет суммы\количества(SUM\COUNT) внутри каждой группы. Т.е. если у вас Group By сгруппировал 2 идиентичные записи (user_id=1) То COUNT - вернет количество сгруппированых в одну строку записей(т.е. в вашем случае 2 шт).

Group BY подавляет вывод, но не мешает подсчету удаленных из вывода данных.

READ ALSO
Что означает `st1` и `st2` в данном примере?

Что означает `st1` и `st2` в данном примере?

Finding Rows with the Maximum Value of a Column by Group

147
Как скопировать данные из одной таблицы в другую MySQL?

Как скопировать данные из одной таблицы в другую MySQL?

имеются две таблицы с разными полями таблица test: id,name,address,phone,birthday,company,about

174
Иерархическая зависимость значений

Иерархическая зависимость значений

Подскажите, как можно решить проблему: Есть таблица table1:

159
jdbc over ssh example

jdbc over ssh example

Как подключиться к mysql через ssh по jdbc? Желательно с примерами кода

126