【问题标题】:MySql query to select total orders for customersMySql 查询为客户选择总订单
【发布时间】:2016-03-22 06:43:20
【问题描述】:

标题并不能很好地描述我需要从查询中得到什么。

@sgeddes 帮助我提出了以下查询,但查询需要进行一些更改才能满足我的需求。我还稍微修改了查询以不选择已删除的客户,但由于此查询的编写方式超出了我的 SQL 知识范围,我无法进行太大更改。

SELECT  d.customer_id,d.fname,d.lname,d.isactive,
        o.lastdate, 
        Count(o2.order_id) AS 'total_orders'
 FROM   customers d
        LEFT JOIN (SELECT MAX(order_id) order_id, customer_id
              FROM   orders 
              GROUP BY customer_id) m on d.customer_id = m.customer_id
        LEFT JOIN orders o on m.order_id = o.order_id
        LEFT JOIN orders o2 on d.customer_id = o2.customer_id 
                           AND o2.balance > 0 AND o2.isActive > -1
 WHERE  d.user_id =945766  AND d.isActive > -1 
        AND o2.customer_id IS NULL
GROUP BY d.customer_id

我需要以下三个条件。

  1. isActive > -1 的客户订单计数(-1 = 已删除)
  2. 客户不在订单表中(没有订单的客户)。
  3. isActive = 0 的客户及其对应的订单数

简而言之,我只需要 isActive = 0 的客户,并为 total_orders 列获得实际的 #。

为了更好地帮助您理解我的要求,我创建了一个 SqlFiddle。

Please see my SqlFiddle

【问题讨论】:

  • 可能是这个查询是为其他目的而设计的,即使您需要一个简单的查询,编辑它也可能更复杂......所以请告诉我们您的要求。
  • 所以您想要 3 个单独的查询来获得 3 个单独的结果?
  • @草莓。我正在使用由 UNION 合并的 3 个单独的查询,正如 sgeddes 在我之前的帖子中所建议的那样,我开始使用他的查询版本。
  • 但是 3 个单独的查询有什么问题?
  • @ZafarMalik 我相信如此,因为在我之前关于此要求的帖子中,我首先并不清楚我的所有要求。请看这个帖子stackoverflow.com/questions/36051226/…

标签: mysql sql


【解决方案1】:

如果您的要求是您在 3 点中提到的,那么您可以使用以下查询-

如果您想要单独的查询,请使用下面-

SELECT d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive > -1
GROUP BY d.customer_id;

SELECT DISTINCT d.customer_id, d.fname 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE o.customer_id IS NULL;

SELECT d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive = 0 
GROUP BY d.customer_id;

如果您想通过联合合并它们,请使用下面-

SELECT 'isactive>-1' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive > -1
GROUP BY d.customer_id 
UNION ALL
SELECT DISTINCT 'Customer without Order' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE o.customer_id IS NULL 
UNION ALL
SELECT 'isactive=0' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive = 0 
GROUP BY d.customer_id;

注意:您的主要查询是尝试获取可用于任何其他目的的最新订单,因此,如果您提供与您的确切要求不同的确切要求,那么有人可以帮助您。

【讨论】:

  • 抱歉合并时忘记删除mysql终结符";"现在我已删除,请立即检查。
  • 我会接受你的回答,因为你的查询返回了我的预期结果,但是第一个子查询也在计算 o.isActive=-1(deleted orders) 所以当我添加 'AND o.isActive > -1 ' 第二个子查询(没有订单的客户)的结果全部消失了。不知道为什么。
  • 实际上,在您的主查询中,您使用了客户和订单两个活动状态,我只检查了客户的状态..所以您可以根据需要添加条件,只有客户处于活动状态或订单或两者兼而有之。跨度>
  • 是的,所以我也为 o.isActive 添加了一个条件。现在整个 where 子句看起来像这样“WHERE d.isActive > -1 and o.isActive > -1”。我的问题是,在我添加条件后,没有订单的客户(第二次查询)都消失了。我的意思是他们没有从查询中返回。我不知道为什么。
  • 好的,我修好了。我开始只使用 UNION 而不是 UNION ALL,现在它工作正常。非常感谢。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多