Сложное извлечение данных с использованием только запроса MySQL (общее количество посещений за день текущей недели) - PullRequest
0 голосов
/ 07 января 2012

В течение нескольких дней я пытался сделать это, используя только MySQL (а не MySQL + PHP), но я не очень хорошо справлялся с SQL-запросами.Идея такова, моя таблица (короткая версия):

enter image description here

Каждый раз, когда пользователь заходит на мой сайт, в эту таблицу добавляется строка, включающая дату посещения итип посещения (для этой конкретной задачи мне нужен только тип 'profile_visit'. Мне нужно заполнить диаграмму общим количеством посещений за текущую неделю за день.

Итак, мне нужно что-то получить массивкак Mon (2) Tue (0) Wed (1) и т. д. Как вы думаете, возможно ли сделать это, используя только запросы MySQL? Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 08 января 2012
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

Ссылки:

1 голос
/ 08 января 2012

Это то, что вы ищете?

SELECT
    SUM(CASE WHEN DAYOFWEEK(`datetime`) = 1 THEN 1 ELSE 0 END) AS `sunday_count`,
    SUM(CASE WHEN DAYOFWEEK(`datetime`) = 2 THEN 1 ELSE 0 END) AS `monday_count`,
    SUM(CASE WHEN DAYOFWEEK(`datetime`) = 3 THEN 1 ELSE 0 END) AS `tuesday_count`,
    SUM(CASE WHEN DAYOFWEEK(`datetime`) = 4 THEN 1 ELSE 0 END) AS `wednesday_count`,
    SUM(CASE WHEN DAYOFWEEK(`datetime`) = 5 THEN 1 ELSE 0 END) AS `thursday_count`,
    SUM(CASE WHEN DAYOFWEEK(`datetime`) = 6 THEN 1 ELSE 0 END) AS `friday_count`,
    SUM(CASE WHEN DAYOFWEEK(`datetime`) = 7 THEN 1 ELSE 0 END) AS `saturday_count`

FROM 
    yourtable
WHERE
 type = 'profile_visit'
 AND `datetime` BETWEEN '2012-01-01' AND '2012-01-08'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...