2017-09-14 4 views
1

私はordersテーブルを持っており、同じdd_numberとdd_codeを持つ注文を見つける必要がありますが、注文の1つが "checkout_completed"のステータスでなければなりません。mySQLで特定のステータスで重複を検索

次が正しく同じdd_numberとdd_codeを持ってオーダーを複製見つけた私の現在のSQLである、しかし私は、ステータスをチェックする方法をうまくカント:

SELECT 
      tbOrders.id, tbOrders.dd_number, tbOrders.dd_code, tbOrders.status, COUNT(*) AS totalDupes 
     FROM 
      tbOrders 
     WHERE 
      dd_number IS NOT NULL 
     AND 
      dd_number != '' 
     AND 
      dd_number != '000000' 
     AND 
      dd_number != '00000000' 
     GROUP BY 
      dd_number, dd_code 
     HAVING totalDupes > 1 

の状態のWHERE句を追加= ' checkout_complete 'は両方の注文のステータスが同じである必要があるため、機能しません。どんな助けでも大歓迎です!

+0

'id'と' status'は集約関数にありませんか? – LONG

答えて

1
SELECT 
     tbOrders.id, tbOrders.dd_number, tbOrders.dd_code, tbOrders.status, COUNT(*) AS totalDupes, 
SUM(CASE WHEN status='checkout_complete' THEN 1 ELSE 0 END) as status_count 
    FROM 
     tbOrders 
    WHERE 
     dd_number IS NOT NULL 
    AND 
     dd_number != '' 
    AND 
     dd_number != '000000' 
    AND 
     dd_number != '00000000' 
    GROUP BY 
     dd_number, dd_code 
    HAVING totalDupes > 1 and status_count=1 

あなたは、ステータス

+0

完璧に動作します!ありがとうございました! –

1

うーん、それを行うための複数の方法で1つの以上の集計フィールドの集計レコードを導入することができます。あなたのクエリが間違っているようだけど

HAVING totalDupes > 1 
    AND MAX(CASE WHEN status = 'checkout_complete' THEN 1 ELSE 0 END) = 1 

:私は、条件付きの集約とHAVING句を使用してお勧めしたいです。 IDが一意である場合は、ランダムIDが選択されます。STATUSについても同様です。すべての列は、GROUP BYにあるか、集約関数でラップされている必要があります。 MySQLの古いバージョンだけが構文を受け入れることに注意してください。他のRDBMSでは、これはエラーを投げます。

+0

これも動作することを確認できます –

関連する問題