Mysql:当所有选定的行与给定条件匹配时返回true

时间:2014-01-08 09:38:21

标签: mysql sql optimization set

我有一个具有以下结构的表:

order_rows(row_id, order_id, product_id, ordered_quantity, shipped_quantity)

我编写了以下查询来查找特定订单的所有行是否已发货:

SELECT 1 = ALL (
    SELECT O.ordered_quantity = O.shipped_quantity
    FROM order_rows O
    WHERE O.order_id = 'INSERT_ORDER_ID_HERE'
) AS all_shipped

如果订单的所有行都已完全发货,那么该查询基本上会返回一个填充了TRUE的列(all_shipped)(否则为FALSE)。

在MySQL中,是否有任何类型的分组函数在所有匹配元素都为真时返回true? 我在考虑这样的事情:

SELECT ALL_TRUE(O.ordered_quantity = O.shipped_quantity) AS all_shipped
FROM order_rows O
WHERE O.order_id = 'INSERT_ORDER_ID_HERE'

这将返回我第一次查询的相同结果。

如果这样的函数不存在,还有其他更多优雅的方法来实现这个(我试图摆脱子查询)吗?

2 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS()来测试未发货的行:

SELECT not exists (
  select *
  FROM order_rows O
  WHERE O.order_id = 'INSERT_ORDER_ID_HERE'
  AND O.ordered_quantity != O.shipped_quantity)

如果所有行都是"发货"这将返回1(true)或0(假),如果没有。

这应该表现得非常好,因为扫描应该停在第一行没有发货。

答案 1 :(得分:0)

你可以做与你所做的相反的事情:

SELECT 0 = (SELECT Count(*) 
            FROM   order_rows O 
            WHERE  O.order_id = 'INSERT_ORDER_ID_HERE' 
                   AND O.ordered_quantity <> O.shipped_quantity) AS OK 

此处子查询检查是否有任何未发货的行 我认为在这里进行子查询是相当不错的 我不会尝试让这更优雅。