我有一个具有以下结构的表:
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'
这将返回我第一次查询的相同结果。
如果这样的函数不存在,还有其他更多优雅的方法来实现这个(我试图摆脱子查询)吗?
答案 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
此处子查询检查是否有任何未发货的行 我认为在这里进行子查询是相当不错的 我不会尝试让这更优雅。