php - 使用日历表填补日期范围查询中缺失的空白

标签 php mysql

我正在使用以下查询来拉回某个日期范围内的总产品价格,但是在没有销售的日子里,我仍想显示日期,但值为 0。

我已经创建了一个具有较大日期范围的日历表,但一直无法找出最好的方法,我所做的一切都错过了没有销售的日子。

下面是我正在使用的查询(没有日历表):

SELECT DATE_FORMAT(b.purchase_date, '%d %b %Y') as date, sum(price) as price 
    FROM order_products a 
    INNER JOIN order_saved b 
         ON a.order_id = b.id 
    WHERE b.purchase_date
         BETWEEN '2011-09-16 23:59' AND '2011-10-16 23:59' 
    AND b.status > 2
    AND a.usr_id = 'XXXX'
    GROUP BY DAY(b.purchase_date)
    ORDER BY b.purchase_date ASC

我试过的日历表只包含从 2010-01-01 到 2014-12-30 的日期范围列表(calendar.date 是 table.row)

任何帮助都会很棒。

谢谢!

最佳答案

您需要对日历表进行外部联接。有点像

SELECT c.cal_date, coalesce(t1.price, 0) as total
FROM calendar c
LEFT JOIN (SELECT b.purchase_date::date, sum(price) as price 
           FROM order_products a 
           INNER JOIN order_saved b 
                   ON a.order_id = b.id 
                   AND b.purchase_date BETWEEN '2011-09-16 23:59' AND '2011-10-16 23:59' 
                   AND b.status > 2
                   AND a.usr_id = 'XXXX'
            GROUP BY b.purchase_date) t1 on t1.purchase_date = c.cal_date
WHERE cal_date BETWEEN '2011-09-16 23:59' AND '2011-10-16 23:59' 
ORDER BY c.cal_date

如果您发布 DDL (CREATE TABLE) 语句和最少的 INSERT 语句,您将获得更好的答案,这些语句为我们提供了足够的数据来实际测试我们的答案。 (编辑您的问题并粘贴 DDL 和 INSERT 语句。)

关于php - 使用日历表填补日期范围查询中缺失的空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796401/

相关文章:

php - Amazon DynamoDB 是否比 Amazon RDS (php) 慢?

php - 使用PHP连接Hive Server2

PHP 简单 XML : Handling Unknown Namespaces in SOAP Requests

sql - 测试 MySQL 表中是否存在行的最佳方法

mysql - 表不能有带 auto_increment 的 2 字段主键

php - 为什么不使用 session 而不是数据库来锁定帐户

PHP money 格式在需要时添加小数点和逗号

javascript - 如何根据单击的元素将不同的参数传递给函数?

mysql - 如何根据 MySQL 中的用户登录设置连接超时

MYSQL 按天、周、月分组,带有 php 时间戳