MySQL:选择已完成行的订单

时间:2013-05-21 04:01:32

标签: mysql

这必须简单。

我有两个表:ORDERS和ORDER_LINES。非常简单和不言自明;这是一对多的关系。 ORDER_LINES有一个FULFILLED列,其中包含该特定行完成的日期。

这就是我需要做的事情:选择完成订单的所有ORDERS.ID;即,ORDER_LINES表中的任何FULFILLED列都不是该特定订单的NULL。

示例:

订单#1有两行,两行都不为空

订单#2有一行为空

查询应该只返回#1,因为它已完成。

2 个答案:

答案 0 :(得分:0)

Select *
From orders As O
Where Not Exists    (
                    Select 1
                    From order_lines As OL1
                    Where OL1.Fullfilled Is Null
                         And OL1.OrderId = O.OrderId
                    )

SQL Fiddle version

使用In函数的替代版本:

Select *
From orders As O
Where O.OrderId Not In    (
                          Select OL1.OrderId
                          From order_lines As OL1
                          Where OL1.Fullfilled Is Null
                          )

SQL Fiddle version

<强>加成

希望使用聚合函数来实现此目的。虽然下面是一个解决方案,但使用Exists和In函数的表单比下面的查询更好地表达了意图,因此我建议使用以下两种形式之一:

Select O.OrderId
From Orders As O
    Left Join Order_Lines As OL
        On OL.OrderId = O.OrderId
            And OL.Fullfilled Is Null
Group By O.OrderId
Having Count(OL.Id) = 0

SQL Fiddle version

另一种可能表现最佳的形式:

Select O.OrderId
From Orders As O
    Left Join Order_Lines As OL
        On OL.OrderId = O.OrderId
            And OL.Fullfilled Is Null
Where OL.Id Is Null

SQL Fiddle version

答案 1 :(得分:0)

使用左连接和添加条件来查询仅选择所需列中不为空的行。像这样。

SELECT ORDERS.ID 
FROM ORDERS 
LEFT JOIN ORDER_LINES 
    ON (ORDERS.ID = ORDER_LINES.ORDER_ID) 
WHERE ORDER_LINES.ORDER_ID is not null