Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取某个特定客户去年下的总订单的查询在不存在订单的情况下检索重复日期_Mysql - Fatal编程技术网

Mysql 获取某个特定客户去年下的总订单的查询在不存在订单的情况下检索重复日期

Mysql 获取某个特定客户去年下的总订单的查询在不存在订单的情况下检索重复日期,mysql,Mysql,我正在进行一个查询,以获取某个特定客户(id=329)去年的总订单,使用两个表,即。orders和calendar(这是在不存在相应记录时获取零填充值)表 订单表: SELECT c.datefield AS date , IFNULL((SELECT COUNT(o.order_date) FROM orders WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders FROM calendar AS c LEFT

我正在进行一个查询,以获取某个特定客户(id=329)去年的总订单,使用两个表,即。orders和calendar(这是在不存在相应记录时获取零填充值)表

订单表:

SELECT c.datefield AS date
     , IFNULL((SELECT COUNT(o.order_date) FROM orders 
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders 
  FROM calendar AS c 
  LEFT 
  JOIN orders AS o 
    ON c.datefield = DATE(o.order_date) 
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR) 
GROUP
    BY date
     , o.customer_id 
 ORDER 
    BY date ASC 

日历表:

SELECT c.datefield AS date
     , IFNULL((SELECT COUNT(o.order_date) FROM orders 
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders 
  FROM calendar AS c 
  LEFT 
  JOIN orders AS o 
    ON c.datefield = DATE(o.order_date) 
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR) 
GROUP
    BY date
     , o.customer_id 
 ORDER 
    BY date ASC 

查询:

SELECT c.datefield AS date
     , IFNULL((SELECT COUNT(o.order_date) FROM orders 
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders 
  FROM calendar AS c 
  LEFT 
  JOIN orders AS o 
    ON c.datefield = DATE(o.order_date) 
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR) 
GROUP
    BY date
     , o.customer_id 
 ORDER 
    BY date ASC 
输出:

SELECT c.datefield AS date
     , IFNULL((SELECT COUNT(o.order_date) FROM orders 
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders 
  FROM calendar AS c 
  LEFT 
  JOIN orders AS o 
    ON c.datefield = DATE(o.order_date) 
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR) 
GROUP
    BY date
     , o.customer_id 
 ORDER 
    BY date ASC 

从上图中,您可以看到客户329于2020-01-02下了2笔订单。但检索到同一日期的两个额外行,顺序为0。我想可能是6882和670的客户。这是错误的!我只需要取329号顾客的订单


如何在查询中排除这些不需要的行,并仅检索客户329的订单总数?

若要统计特定客户去年每月的订单总数,请使用此查询:

SELECT MONTHNAME(c.datefield) AS Month, 
    YEAR(CURRENT_DATE - INTERVAL 1 YEAR) AS Year, 
    IFNULL(o.TotalOrders, 0) AS Orders 
    FROM calendar AS c 
    LEFT JOIN (
        SELECT MONTH(o.order_date) AS Month, 
        YEAR(o.order_date) AS Year, 
        COUNT(o.customer_id) AS TotalOrders 
        FROM orders AS o 
        WHERE YEAR(o.order_date) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR) AND o.customer_id = 329 
        GROUP BY Month) AS o 
    ON MONTH(c.datefield) = o.Month 
    GROUP BY MONTH(c.datefield)

@草莓对不起,我不知道我做错了什么!抱歉,但我不知道你目前正在为链接问题接受的答案的哪一部分而挣扎。不知道为什么我得到的是-ve投票而不是解决方案@草莓我应该以文本格式发布mysql架构和数据,而不是这些屏幕截图吗?据我所知,您不能使用mysql 8,而必须使用
calendar
table来
LEFT JOIN
,以便所有日期都显示为0。我可以问一下这个是这样发送到你的前端的吗?或者这是一个使用MySQL客户端软件运行的查询,以获取报告?我这样问是因为有一种方法可以删除
日历
表,并使用带有循环的存储过程来创建所需的日期。@PeterDarmis顺便说一句,我已经发布了我自己问题的答案。