Подсчитывать записи из таблицы mysql между двумя датами и возвращать ноль, если строки пусты - PullRequest
0 голосов
/ 04 августа 2020

У меня есть таблица в mysql с двумя полями:

        DATA        | PAGE
2020-07-30 21:44:08 | abc
2020-07-31 20:14:18 | abc
2020-08-02 12:23:08 | xyz
2020-08-04 10:21:27 | abc
2020-08-04 12:54:32 | def
2020-08-04 15:41:44 | abc

Я хотел бы запросить таблицу для страницы «ab c» и получить сумму ежедневных просмотров с последнего 7 дней и вернуть ноль, если на странице нет просмотров:

    DATA   | VIEWS
2020-07-29 | 0
2020-07-30 | 1
2020-07-31 | 1
2020-08-01 | 0
2020-08-02 | 0
2020-08-03 | 0
2020-08-04 | 2

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

SELECT DATE_FORMAT(data, "%Y-%m-%d") as data, count(*)-1 as views
FROM (
  SELECT date(data) as data FROM visitas as t1 where page like "abc"
    UNION ALL 
    SELECT curdate() - interval a day AS data
    FROM (
      SELECT 0 as a UNION
      SELECT 1 UNION
      SELECT 2 UNION
      SELECT 3 UNION
      SELECT 4 UNION
      SELECT 5 UNION
      SELECT 6
    ) as t2
  ) as t3 GROUP BY data
ORDER BY data DESC
LIMIT 7

Можно ли улучшить этот запрос?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вы можете сделать это без JOIN и вместо этого использовать UNION:

SELECT dd,SUM(cnt) as VIEWS FROM (
SELECT DATE(NOW())- INTERVAL 6 DAY as dd , 0 as cnt
UNION
SELECT DATE(NOW())- INTERVAL 5 DAY as dd , 0 as cnt
UNION
SELECT DATE(NOW())- INTERVAL 4 DAY as dd , 0 as cnt
UNION
SELECT DATE(NOW())- INTERVAL 3 DAY as dd , 0 as cnt
UNION
SELECT DATE(NOW())- INTERVAL 2 DAY as dd , 0 as cnt
UNION
SELECT DATE(NOW())- INTERVAL 1 DAY as dd , 0 as cnt
UNION
SELECT DATE(NOW())- INTERVAL 0 DAY as dd , 0 as cnt
UNION ALL
SELECT DATE(`date`) as dd, 1 as cnt FROM `test3` WHERE page='abc' AND  DATE(`date`) >= DATE(NOW()) - INTERVAL 7 DAY
    ) as tb1 GROUP BY dd

Результат будет

 dd        | VIEWS  
--------------------
2020-07-29 |   0
2020-07-30 |   1
2020-07-31 |   1
2020-08-01 |   0
2020-08-02 |   0
2020-08-03 |   0
2020-08-04 |   2
0 голосов
/ 04 августа 2020

С присоединением LEFT календаря к таблице:

SELECT DATE_FORMAT(c.data, "%Y-%m-%d") data, 
       COUNT(page) views
FROM (
  SELECT CURDATE() - INTERVAL a day data
  FROM (
    SELECT 0 as a UNION
    SELECT 1 UNION
    SELECT 2 UNION
    SELECT 3 UNION
    SELECT 4 UNION
    SELECT 5 UNION
    SELECT 6
  ) t  
) c
LEFT JOIN visitas v 
ON DATE(v.data) = c.data AND page = 'abc'
GROUP BY c.data
ORDER BY c.data DESC

См. демонстрацию . Результатов:

| data       | views |
| ---------- | ----- |
| 2020-08-04 | 2     |
| 2020-08-03 | 0     |
| 2020-08-02 | 0     |
| 2020-08-01 | 0     |
| 2020-07-31 | 1     |
| 2020-07-30 | 1     |
| 2020-07-29 | 0     |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...