【问题标题】:MySQL - Join records where all sub records have a valueMySQL - 连接所有子记录都有值的记录
【发布时间】:2014-11-01 03:43:59
【问题描述】:

第 1 部分

假设我有一个 orders 表,每个订单都有一个或多个分期付款。

分期付款

id  |  order_id  |  customer_id  |  timestamp
-------------------------------------------------------
1   |      1     |       5       |  2014-10-31 00:00:00
2   |      1     |       5       |  NULL
3   |      1     |       5       |  2014-10-31 00:00:00
4   |      2     |       8       |  2014-10-31 00:00:00
5   |      2     |       8       |  2014-10-31 00:00:00
6   |      2     |       8       |  2014-10-31 00:00:00
7   |      3     |       5       |  2014-10-31 00:00:00

我想检索所有分期付款都有时间戳的所有订单,其中最大的时间戳在过去 X 天内。

在上表中,我应该检索订单 ID 2 和 3,而不是 1,因为其中一个分期付款的时间戳为 NULL。

我能做到这一点的最有效方法是什么?我真的不知道从哪里开始,但我想我需要某种子查询来稍后处理数据。

第 2 部分

最终,我在这里要做的是计算每个客户有多少订单通过了第 1 部分的测试(只有所有分期付款都有时间戳的订单),然后我会将其与另一个值进行比较。

因此,一旦我有一个包含所有订单的结果集,其中所有分期付款都有时间戳,我如何将它们分组以包括每个符合条件的客户的计数?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:
    select order_id
    from order
    group by order_id
    having sum(timestamp is null) = 0
    

    关于你问题的第二部分:

    select customer_id, count(distinct order_id) as unique_orders
    from order
    where timestamp is not null
    group by customer_id
    

    【讨论】:

    • 谢谢,很快。我在问题中添加了第二部分,详细说明了我将要解决的问题。有什么想法吗?
    【解决方案2】:

    试试这个:

    SELECT count(*), customer_id
    FROM order
    WHERE timestamp is not null
    GROUP BY customer_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多