【问题标题】:How to fetch all orders excluding very first order of each customer in mysql如何在mysql中获取除每个客户的第一个订单之外的所有订单
【发布时间】:2019-10-17 08:38:07
【问题描述】:

这是我的orders 表:

我想选择除每个客户的第一个订单之外的所有订单(如果客户下了多个订单)。

因此,如果客户例如215 总共有 8 个订单,那么我将选择他所有的最后 7 个订单,不包括他在 2017 年 7 月 10 日下的第一个订单 70000。

但是如果客户例如219只下过一个订单70007,必须被查询选中。

【问题讨论】:

标签: mysql


【解决方案1】:

使用反连接方法:

SELECT o1.order_id, o1.customer_id, o1.order_date, o1.order_value
FROM orders o1
LEFT JOIN
(
    SELECT customer_id, MIN(order_date) AS min_order_date, COUNT(*) AS cnt
    FROM orders
    GROUP BY customer_id
) o2
    ON o1.customer_id = o2.customer_id AND
       o1.order_date = o2.min_order_date
WHERE
    o2.customer_site = 1 AND
    (o2.customer_id IS NULL OR
    o2.cnt = 1);

这里的想法是尝试将orders 中的每条记录与每个客户的子查询中的一条记录相匹配,该子查询仅包含第一笔订单记录。如果我们找不到匹配,那么这样的订单记录就不可能是第一个。

【讨论】:

  • 您的查询没有像我在帖子中提到的那样工作。您的查询错过了只有一份订单的客户 2019。我特别写了这样的客户必须包含在结果集中。
  • @user3779493 抱歉,我错过了那个极端情况。我已经更新了我的答案。
  • Tim,我实际上还有一个名为customer_site 的列,它等于1 或2。我只想从customer_site = 1 获取订单。如何修改上述查询?
  • 在您更新答案之前,我自己已经这样做了。但我的方法不同。 o1.customer_site = 1 AND (o2.bp_customer_id IS NULL OR... 并且不需要在第二张表 o2 中使用 WHERE customer_site = 1
  • 它是如此复杂。但我的解决方案很容易理解。
【解决方案2】:

你可以试试下面-

select order_id,customer_id,order_date,order_Value
from tablename
group by order_id,customer_id,order_date,order_Value
having count(order_id)=1
union all
select order_id,customer_id,order_date,order_Value
from tablename a where order_date not in (select min(order_date) from tablename b
where a.customer_id=b.customer_id)

【讨论】:

    【解决方案3】:

    解决方案

    亲爱的@Tim Biegeleisen,您的回答差不多完成了。只需添加HAVING COUNT(customer_id)>1 所以查询如下:

    SELECT o1.order_id, o1.customer_id, o1.order_date, o1.order_value
    FROM orders o1 
    LEFT JOIN (
      SELECT customer_id, MIN(order_date) AS min_order_date
      FROM orders
      GROUP BY customer_id
      HAVING COUNT(customer_id)>1
    ) o2
    ON o1.customer_id = o2.customer_id AND
       o1.order_date = o2.min_order_date
    WHERE
    o2.customer_id IS NULL;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多