MySQL Subquery Count с использованием псевдонима DATE_FORMAT - PullRequest
1 голос
/ 25 марта 2011

Последние несколько часов я бился головой о стену, пытаясь заставить этот единственный запрос работать, но безуспешно.

У меня есть одна таблица под названием viewer_log.

Каждая строка представляет собой просмотр страницы, к которому прикреплены session_id и отметка времени.

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

Пока что этот запрос (который также занимал много времени, чтобы работать):

SELECT day, COUNT(*) as unique_sessions from (SELECT COUNT(viewer_session_id) AS sessions, DATE_FORMAT(timestamp, "%Y-%m-%d") AS day FROM viewer_log GROUP BY `viewer_session_id` HAVING day='2011-03-23') AS sessions;

Вы заметите, что день жестко задан, давая

mysql> SELECT day, COUNT(*) as unique_sessions from (SELECT COUNT(viewer_session_id) AS sessions, DATE_FORMAT(timestamp, "%Y-%m-%d") AS day FROM viewer_log GROUP BY `viewer_session_id` HAVING day='2011-03-23') AS sessions;
+------------+-----------------+
| day        | unique_sessions |
+------------+-----------------+
| 2011-03-23 |              21 |
+------------+-----------------+

IЯ хотел бы расширить эти результаты, не указывая день, когда я сталкиваюсь с проблемами и не могу найти ответ в Интернете ... Я уверен, что он там, не уверен, что я ищу.

EG:

+------------+-----------------+
| day        | unique_sessions |
+------------+-----------------+
| 2011-03-21 |              14 |
| 2011-03-22 |              11 |
| 2011-03-23 |              21 |
+------------+-----------------+

У меня много проблем с продвижением по этой точке, я пытался объединить таблицу с копией ее собственной, но обычно сталкиваюсь с неизвестным именем столбца ИЛИрезультатs Я думаю, что должны появиться неправильно:

mysql> select DATE_FORMAT(v.timestamp, "%Y-%m-%d") AS date, count(sessions) as rows from (SELECT COUNT(viewer_session_id) AS sessions, DATE_FORMAT(timestamp, "%Y-%m-%d") AS date FROM viewer_log GROUP BY viewer_session_id) AS s JOIN viewer_log v ON (s.date=date) GROUP BY date;

+------------+--------+
| date       | rows   |
+------------+--------+
| 0000-00-00 |   2551 |
| 0000-00-00 |  20408 |
| 0000-00-00 |  20408 |
| 0000-00-00 |   5102 |
| 0000-00-00 |   2551 |
| 0000-00-00 |   2551 |
| 0000-00-00 |  63775 |
| 0000-00-00 | 211733 |
| 0000-00-00 |  53571 |
| 0000-00-00 |  53571 |
| 0000-00-00 |  53571 |
| 0000-00-00 |  51020 |
| 0000-00-00 |  48469 |
| 0000-00-00 |  91836 |
| 0000-00-00 |  86734 |
| 0000-00-00 |  33163 |
| 0000-00-00 |  45918 |
| 0000-00-00 |  28061 |
| 0000-00-00 |  86734 |
| 0000-00-00 |  76530 |
| 0000-00-00 |  53571 |
| 0000-00-00 |  33163 |
+------------+--------+
22 rows in set, 1 warning (0.63 sec)

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Спасибо, изменив ваше предложение, я сделал следующее:

mysql> SELECT day, COUNT(*) AS unique_sessions FROM (SELECT DATE(timestamp) AS day, COUNT(0) as unique_sessions FROM viewer_log GROUP BY day, viewer_session_id) as blah GROUP BY blah.day ORDER BY day DESC;
+------------+-----------------+
| day        | unique_sessions |
+------------+-----------------+
| 2011-03-24 |              14 |
| 2011-03-23 |              23 |
| 2011-03-22 |              30 |
| 2011-03-21 |              35 |
| 2011-03-20 |              11 |
| 2011-03-19 |              18 |
| 2011-03-18 |              15 |
| 2011-03-17 |              34 |
| 2011-03-16 |              37 |
| 2011-03-15 |              21 |
| 2011-03-14 |              20 |
| 2011-03-13 |              21 |
| 2011-03-12 |              21 |
| 2011-03-11 |              21 |
| 2011-03-10 |              84 |
| 2011-03-09 |              26 |
| 2011-03-07 |               1 |
| 2011-03-05 |               1 |
| 2011-03-04 |               2 |
| 2011-03-03 |               9 |
| 2011-03-02 |               9 |
| 0000-00-00 |               1 |
+------------+-----------------+

Ура! * * 1004

1 голос
/ 25 марта 2011

Попробуйте

  SELECT DATE(timestamp) AS day,
         COUNT(0) as unique_sessions
    FROM viewer_log
GROUP BY DATE(timestamp), viewer_session_id

Вы можете добавить условие WHERE, например

  SELECT DATE(timestamp) AS day,
         COUNT(0) as unique_sessions
    FROM viewer_log
   WHERE DATE(timestamp) >= '2011-03-01'
     AND DATE(timestamp) <= '2011-03-21'
GROUP BY DATE(timestamp), viewer_session_id

Это предполагает, что отметка времени является отметкой времени mysql, а не отметкой времени unix

...