从 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,其中包含您需要的所有日期。