MySQL - Странности при подсчете, которые я не могу объяснить

0

Выполняя простой запрос, я нахожу два очень разных результата, и я не уверен, как я прихожу к такому выводу. Ниже приведен пример, пожалуйста, дайте мне знать, если что-то, что я только что просмотрел.

SELECT b.fkid as t, 
       b.timestamp, 
       count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by val1

... Результат:

2 2009-09-25 08:33:42 **27** 3 2009-09-25

... по сравнению с:

SELECT b.fkid as t, 
       b.timestamp, 
       count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by t

.. результат:

2  2009-09-25 08:33:42 **39** 1  2009-09-25 
3  2009-09-25 08:36:59 **6**  1  2009-09-25 
10 2009-09-25 22:40:14 **4**  1  2009-09-25

Я не понимаю, как 39 + 6 + 4 = 27? Я ожидаю, что первым значением будет 49, а не 27. Также попробовали:

SELECT b.fkid as t, 
       b.timestamp, 
       count(b.fkid) as hits, 
       count((b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by val1

... который производит:

2   2009-09-25 08:33:42     27      27      2009-09-25

Следуя рекомендациям ниже, я попытался устранить нерелевантные данные и сделал запрос:

SELECT count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num, 
       DATE_FORMAT( b.timestamp,  '%Y-%m-%d' ) AS val1
  FROM a, b
 WHERE a.id = b.fkid
group by val1

... это произвело:

27      3   2009-09-25

Я попытался упростить это:

SELECT count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num
  FROM a, b
 WHERE a.id = b.fkid
group DATE_FORMAT( b.timestamp,  '%Y-%m-%d' )

... это произвело:

27      3

и

SELECT count(b.fkid) as hits, 
       count(distinct(b.fkid)) as num
  FROM a, b
 WHERE a.id = b.fkid
group b.fkid

... это произвело:

39      1
6   1
4   1
  • 0
    что такое "val1"? Это стандарт или что-то, о чем я не знаю? или другое поле
  • 0
    val1 просто переименовывает DATE_FORMAT (b.timestamp, «% Y-% m-% d), поэтому я могу группировать по val1 вместо группировки по DATE_FORMAT (b.timestamp,«% Y-% m-% d).
Показать ещё 5 комментариев
Теги:

4 ответа

3
Лучший ответ

В SQL вы должны группировать все поля, которые не являются агрегатами, а не только val1.

MySQL позволяет вам уйти от этого (большинство других баз данных будет вызывать ошибку), но это может привести к непредсказуемому поведению, особенно если val1 не определяет вашу совокупность, которую вы производите.

  • 1
    К сожалению, да - выборочная группа по поведению работает как спроектировано в MySQL. Есть множество вопросов «почему это не работает на моей БД, когда работает на MySQL», вопросы о SO: /
  • 0
    Итак, просто чтобы убедиться, что я правильно понимаю, я должен сгруппировать все поля, которые не являются правильными агрегатами? Я сделал это в моем последнем примере, есть ли что-то другое, что я должен делать? Еще раз спасибо
Показать ещё 2 комментария
0

Вы считаете отличные значения fkid. Могут ли быть дубликаты этого значения? Я думаю, что это может изменить ваши цифры.

  • 0
    Я попытался удалить отчетливое, однако затем получилось значение 27 в подсчете (отличное (b.fkid)) как num вместе с исходным значением 27.
0

В первом запросе ваша группировка по val1 одинакова для всех записей, поэтому вы видите только первое значение неагрегатных функций.

Во втором запросе вы видите 3 результата - количество разных fkid

надеюсь, что это поможет.

0

Отформатировав дату val1, вы берете записи с разными отметками времени (но с той же датой календаря) и группируете их. AKA отметка времени для "2009-12-01 01:00:00" и "2009-12-01 02:00:00", отформатированная с DATE_FORMAT, вы указываете оба значения "2009-12-01". НО, не группируя этот формат даты во втором запросе, записи остаются отдельными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню