从 MYSQL 中的 Now() 选择最近 7 天(如果没有数据 return 0)
Selecting the last 7 days from Now() in MYSQL(if no data return 0)
如果没有数据 return 0,如何 select 从 MYSQL 中的 Now() 开始的最后 7 天?我把SQL贴在下面了,有大佬知道怎么解决吗?
非常感谢您的建议。
```SQL
SELECT SUM(pv) AS pv_count,
DATE_FORMAT(insert_time,'%Y-%m-%d') AS visit_date
FROM visit
-- WHERE insert_time >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY DATE_FORMAT(insert_time,'%Y-%m-%d')
ORDER BY DATE_FORMAT(insert_time,'%Y-%m-%d') DESC
LIMIT 7
```
pv_count visit_date
19091 2022-02-28
22342 2022-02-25
42342 2022-02-24
92532 2022-02-23
62353 2022-02-22
67234 2022-02-21
22342 2022-02-19
我得到了上面的输出 SQL,但这不是我需要的数据,我的预期输出如下(我在这个 link dbfiddle 中添加了一些数据):
pv_count visit_date
0 2022-03-06
0 2022-03-05
0 2022-03-04
0 2022-03-03
0 2022-03-02
0 2022-03-01
19091 2022-02-28
或如下:
visit_date 2022-02-28 2022-03-01 2022-03-02 2022-03-03 2022-03-04 2022-03-05 2022-03-06
pv_count 19091 0 0 0 0 0 0 0
为什么我粘贴了两个预期的输出?因为我真的需要一个简单的方法来解决它,我有10多个表来return这些数据
您在这里需要一个日历 table,它是一个 table,其中包含您希望在报告中显示的所有日期。考虑以下查询:
SELECT d.dt, SUM(v.pv) AS pv_count
FROM
(
SELECT '2022-02-28' AS dt UNION ALL SELECT '2022-03-01' UNION ALL
SELECT '2022-03-02' UNION ALL SELECT '2022-03-03' UNION ALL
SELECT '2022-03-04' UNION ALL SELECT '2022-03-05' UNION ALL
SELECT '2022-03-06'
) d
LEFT JOIN visit v
ON d.dt = DATE(v.insert_time) AND
v.insert_time >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY
d.dt
ORDER BY
dt.DESC
LIMIT 7;
请注意,在实践中,上面别名为 d
的内联子查询可以替换为真正的 table,其中包含您需要的所有日期。
如果没有数据 return 0,如何 select 从 MYSQL 中的 Now() 开始的最后 7 天?我把SQL贴在下面了,有大佬知道怎么解决吗?
非常感谢您的建议。
```SQL
SELECT SUM(pv) AS pv_count,
DATE_FORMAT(insert_time,'%Y-%m-%d') AS visit_date
FROM visit
-- WHERE insert_time >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY DATE_FORMAT(insert_time,'%Y-%m-%d')
ORDER BY DATE_FORMAT(insert_time,'%Y-%m-%d') DESC
LIMIT 7
```
pv_count visit_date
19091 2022-02-28
22342 2022-02-25
42342 2022-02-24
92532 2022-02-23
62353 2022-02-22
67234 2022-02-21
22342 2022-02-19
我得到了上面的输出 SQL,但这不是我需要的数据,我的预期输出如下(我在这个 link dbfiddle 中添加了一些数据):
pv_count visit_date
0 2022-03-06
0 2022-03-05
0 2022-03-04
0 2022-03-03
0 2022-03-02
0 2022-03-01
19091 2022-02-28
或如下:
visit_date 2022-02-28 2022-03-01 2022-03-02 2022-03-03 2022-03-04 2022-03-05 2022-03-06
pv_count 19091 0 0 0 0 0 0 0
为什么我粘贴了两个预期的输出?因为我真的需要一个简单的方法来解决它,我有10多个表来return这些数据
您在这里需要一个日历 table,它是一个 table,其中包含您希望在报告中显示的所有日期。考虑以下查询:
SELECT d.dt, SUM(v.pv) AS pv_count
FROM
(
SELECT '2022-02-28' AS dt UNION ALL SELECT '2022-03-01' UNION ALL
SELECT '2022-03-02' UNION ALL SELECT '2022-03-03' UNION ALL
SELECT '2022-03-04' UNION ALL SELECT '2022-03-05' UNION ALL
SELECT '2022-03-06'
) d
LEFT JOIN visit v
ON d.dt = DATE(v.insert_time) AND
v.insert_time >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY
d.dt
ORDER BY
dt.DESC
LIMIT 7;
请注意,在实践中,上面别名为 d
的内联子查询可以替换为真正的 table,其中包含您需要的所有日期。