2017-07-21 45 views
1
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 

は、それは私がHAVING句の列に索引がどんな効果を持つとは思わないop.presaleは、0と1SQL最適化最適化?

+0

私はこの場合に何か改善するつもりはないと思います。しかし、あなたは自分で確認することができます!インデックスを作成する前後にEXPLAINを使用し、違いがあるかどうかを確認してください。私は違いがあるとは思わない。 –

答えて

0

のみが含まれている場合op.presaleにインデックスを持つことは良いアイデアです。 である少なくとも一つの前売り値を持つすべてのorder_idを見つけた新しいサブクエリに参加するためにここに

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 

基本的な考え方を:しかし、あなたはWHERE句にHAVING句でロジックを移動するためにクエリを書き直すことができますではありません。そのようなマッチングorder_idは、したがって、ゼロに等しくない前売りの合計を有する。私はこのサブクエリにLEFT JOINを使用し、このサブクエリに一致するではないの注文レコードだけを保持します。