В SQL почему group by делает разницу при использовании count () - PullRequest
1 голос
/ 12 февраля 2012

У меня есть таблица, в которой хранится zone_id.Иногда идентификатор зоны дважды в базе данных.Я написал запрос, чтобы показать только записи, которые имеют две или более записей одного и того же zone_id в таблице.

Следующий запрос возвращает правильный результат:

select *, count(zone_id)
from proxies.storage_used
group by zone_id desc
having count(zone_id) > 1;

Однако, если я группирую по last_updated или company_id, он возвращает случайные значения.Если я не добавлю предложение group by, оно отображает только одно значение, как показано на скриншоте ниже.Первый вывод показывает вышеуказанную строку запроса, второй вывод показывает ту же строку запроса без строки 'group by' и возвращает только одно значение:

коррекция : Я являюсьновый член и, следовательно, не может публиковать изображения напрямую, поэтому я добавил его в минус: http://min.us/m3yrlkSMu#1o

Пока мой запрос работает, я не понимаю, почему.Может ли кто-нибудь помочь мне понять, почему group by изменяет фактический результат, а не только группирует выход?Я использую MySQL.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Группа делит результирующие строки на группы и выполняет функцию агрегирования записей в каждой группе. Если вы сделаете счет (*) без группы, вы получите один счетчик всех строк в таблице. Поскольку вы не указали группу, существует только одна группа, все записи в таблице. Если вы выполните подсчет (*) для группы по идентификатору зоны, вы получите счетчик количества записей для каждого идентификатора зоны. Если вы выполните подсчет (*) идентификатора зоны и даты последнего обновления, вы получите счетчик того, сколько строк было обновлено на каждую дату в каждой зоне.

1 голос
/ 12 февраля 2012

Без предложения group by все хранится в одной группе, поэтому вы получите один результат. Если в вашей таблице более одной строки, то having будет успешным. Итак, вы закончите подсчет всех строк в вашей таблице ...

источник

Из того, что я получил, вы могли бы создать запрос с having и без group by только в двух ситуациях:

  1. У вас есть предложение where, и вы хотите проверить условие агрегации всех строк, удовлетворяющих этому условию.

  2. То же, что и выше, но для всех строк в вашей таблице (хотя на практике это не имеет смысла).

...