SELECT op.order_id
FROM order o
JOIN order_product op
USING(order_id)
WHERE o.quantity_complete = 0
GROUP BY op.order_id
HAVING SUM(op.presale) = 0
如果op.presale
仅包含0和1,则在op.presale
上设置索引是个好主意。
答案 0 :(得分:0)
我不认为HAVING
子句中列的索引会产生任何影响。但是,您可以重写查询以将HAVING
子句中的逻辑移动到WHERE
子句:
SELECT
op.order_id
FROM order o
INNER JOIN order_product op
ON o.order_id = op.order_id
LEFT JOIN
(
SELECT DISTINCT order_id
FROM order_product
WHERE presale <> 0
) t
ON op.order_id = t.order_id
WHERE
o.quantity_complete = 0 AND
t.order_id IS NULL -- replaces the HAVING clause
GROUP BY op.order_id
这里的基本思想是加入一个新的子查询,该子查询找到所有order_id
至少有一个预先设定值不为零。因此,这种匹配order_id
将具有不等于零的预售总和。我对此子查询使用LEFT JOIN
,然后仅保留不与此子查询匹配的订单记录。