SELECT
COUNT(DAYOFWEEK(`datetime`) = 1 OR NULL) AS Sun,
COUNT(DAYOFWEEK(`datetime`) = 2 OR NULL) AS Mon,
COUNT(DAYOFWEEK(`datetime`) = 3 OR NULL) AS Tue,
COUNT(DAYOFWEEK(`datetime`) = 4 OR NULL) AS Wed,
COUNT(DAYOFWEEK(`datetime`) = 5 OR NULL) AS Thu,
COUNT(DAYOFWEEK(`datetime`) = 6 OR NULL) AS Fri,
COUNT(DAYOFWEEK(`datetime`) = 7 OR NULL) AS Sat
FROM atable
WHERE `type` = 'profile_visit'
AND `datetime` >= CURRENT_DATE() - INTERVAL (DAYOFWEEK(CURRENT_DATE()) - 1) DAY
AND `datetime` < CURRENT_DATE() + INTERVAL 1 DAY
Вместо
COUNT(DAYOFWEEK(`datetime`) = 1 OR NULL)
вы также можете использовать
SUM(DAYOFWEEK(`datetime`) = 1)
Я склонен использовать COUNT
, когда речь идет о подсчете, но это всего лишь личное предпочтение.Не существует различий в результатах, возвращаемых любым из этих методов, и их не должно быть ни в отношении производительности.
Часть OR NULL
выражения COUNT
объясняется здесь:
ОБНОВЛЕНИЕ
Для недель, начинающихся с понедельника, попробуйте следующий эквивалент вышеуказанного сценария:
SELECT
COUNT(WEEKDAY(`datetime`) = 0 OR NULL) AS Mon,
COUNT(WEEKDAY(`datetime`) = 1 OR NULL) AS Tue,
COUNT(WEEKDAY(`datetime`) = 2 OR NULL) AS Wed,
COUNT(WEEKDAY(`datetime`) = 3 OR NULL) AS Thu,
COUNT(WEEKDAY(`datetime`) = 4 OR NULL) AS Fri,
COUNT(WEEKDAY(`datetime`) = 5 OR NULL) AS Sat,
COUNT(WEEKDAY(`datetime`) = 6 OR NULL) AS Sun
FROM atable
WHERE `type` = 'profile_visit'
AND `datetime` >= CURRENT_DATE() - INTERVAL ( WEEKDAY(CURRENT_DATE()) ) DAY
AND `datetime` < CURRENT_DATE() + INTERVAL 1 DAY
Ссылки: