Выполняя простой запрос, я нахожу два очень разных результата, и я не уверен, как я прихожу к такому выводу. Ниже приведен пример, пожалуйста, дайте мне знать, если что-то, что я только что просмотрел.
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
В SQL вы должны группировать все поля, которые не являются агрегатами, а не только val1.
MySQL позволяет вам уйти от этого (большинство других баз данных будет вызывать ошибку), но это может привести к непредсказуемому поведению, особенно если val1 не определяет вашу совокупность, которую вы производите.
Вы считаете отличные значения fkid. Могут ли быть дубликаты этого значения? Я думаю, что это может изменить ваши цифры.
В первом запросе ваша группировка по val1 одинакова для всех записей, поэтому вы видите только первое значение неагрегатных функций.
Во втором запросе вы видите 3 результата - количество разных fkid
надеюсь, что это поможет.
Отформатировав дату val1, вы берете записи с разными отметками времени (но с той же датой календаря) и группируете их. AKA отметка времени для "2009-12-01 01:00:00" и "2009-12-01 02:00:00", отформатированная с DATE_FORMAT, вы указываете оба значения "2009-12-01". НО, не группируя этот формат даты во втором запросе, записи остаются отдельными.