2017-05-29 15 views
0

在我的表格中,需要生成項目的訂單(在我的示例中已經簡化)。 我必須只過濾那些完全完成的訂單。如果所有訂單(具有相同的order_id)的狀態爲「4」或「-1」,則完成訂單。如何過濾羣組及其內容的表格

"id" "order_id" "item_nr" "status" 
"689" "4"   "M2223"  "3" 
"690" "4"   "K3224"  "-1" 
"691" "4"   "X1837"  "4" 
"692" "4"   "M2338"  "0" 
"693" "5"   "E7273"  "4" 
"694" "5"   "E8883"  "-1" 
"695" "5"   "B9217"  "4" 
"696" "5"   "B2662"  "4" 

在這個例子中的情況:我想要得到的結果是:

"693" "5"   "E7273"  "4" 
"694" "5"   "E8883"  "-1" 
"695" "5"   "B9217"  "4" 
"696" "5"   "B2662"  "4" 

如何選擇呢?

回答

3

一個選項是LEFT JOIN您的表到子查詢,該子查詢標識所有匹配訂單,然後僅保留來自不匹配訂單的記錄。這意味着這些匹配的訂單沒有任何記錄狀態不完整。

SELECT t1.* 
FROM yourTable t1 
LEFT JOIN 
(
    SELECT order_id 
    FROM yourTable 
    WHERE status NOT IN ('4', '-1') 
) t2 
    ON t1.order_id = t2.order_id 
WHERE t2.order_id IS NULL 

輸出:

enter image description here

演示在這裏:

Rextester

每註釋通過@shadow我們也詞組這個查詢使用NOT EXISTS

SELECT t1.* 
FROM yourTable t1 
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM yourTable t2 
    WHERE t2.status NOT IN ('4', '-1') AND t2.order_id = t1.order_id 
) 
+0

[Here](http://sqlfiddle.com/#!9/8d78bb/1)是一個sqlfiddle,預期結果與Tim的查詢。 – FrankerZ

+0

使用不存在insted不在中可能會加速它。我喜歡解釋,所以得到我的投票。 – Shadow

+0

@Shadow我給了'NOT EXISTS'的更新。說實話,我並不經常使用它,但也許我應該研究在MySQL中使用它的性能好處。 –