2016-07-13 49 views
1

哪些記錄我有以下表 'StockItems'(簡本爲例):MySQL的 - Select語句,集團通過對符合條件

+----+----------+---------+---------+---------+-----+ 
| ID | SubCatID | Item | GroupID | Size | Def | 
+----+----------+---------+---------+---------+-----+ 
| 1 |  1 | 40mm |  2 | 1 | 1 | 
| 2 |  1 | 40mm |  2 | 1 | 0 | 
| 3 |  1 | 75mm |  3 | 1 | 1 | 
| 4 |  2 | 90mm |  4 | NULL | 1 | 
+----+----------+---------+---------+---------+-----+ 

下面是該查詢我:

SELECT ID, SubCatID, Item, GroupID 
FROM StockItems 
WHERE ((GroupID = 0 OR GroupID IS NULL) OR ((GroupID IS NOT NULL OR GroupID <> 0) AND Def = 1) OR Size IS NOT NULL) AND Del=0 
ORDER BY SubCatID, Size, Item+0, Item 

其中Def是GroupID中的默認項目,Del代表刪除

這可行,但我需要1個步驟來實現我想要的結果:我不想檢索具有相同GroupID和大小的記錄WHERE SubCatID = 1

如果羣ID和大小都相同的任何組ID,我希望它檢索記錄,其中防守= 1

我差點沒有通過使用以下查詢:

SELECT ID, SubCatID, Item, GroupID 
FROM StockItems 
WHERE ((GroupID = 0 OR GroupID is Null) OR ((GroupID IS NOT NULL OR GroupID <> 0) AND Def = 1) OR Size IS NOT NULL) AND Del=0 
GROUP BY GroupID, Size 
ORDER BY SubCatID, Size, Item+0, Item 

但我只希望將GROUP BY應用於SubCatID = 1的記錄

我不確定是否GROUP BY是要走到這裏的路,它只是我看到的最接近我需要的東西

輸出第一查詢:

+-----+----------+---------------+----------+ 
| ID | SubCatID |  Item  | GroupID | 
+-----+----------+---------------+----------+ 
| 1 |  1 | 40mm Pipe | 2  | 
| 331 |  1 | 40mm Pipe | 2  | 
| 329 |  1 | 63mm Pipe | 3  | 
| 330 |  1 | 75mm Pipe | 4  | 
| 2 |  1 | 40mm Pipe | 2  | 
| 332 |  1 | 40mm Pipe | 2  | 
| 3 |  1 | 63mm Pipe | 3  | 
| 4 |  1 | 75mm Pipe | 4  | 
| 6 |  1 | 110mm Pipe | 6  | 
| 7 |  1 | 125mm Pipe | 7  | 
| 8 |  1 | 160mm Pipe | 8  | 
| 9 |  1 | 200mm Pipe | 9  | 
| 10 |  1 | 250mm Pipe | 10  | 
| 11 |  1 | 315mm Pipe | 11  | 
| 12 |  1 | 355mm Pipe | 12  | 
| 13 |  1 | 400mm Pipe | 13  | 
| 14 |  1 | 450mm Pipe | 14  | 
| 5 |  1 | 90mm Pipe | 5  | 
| 15 |  18 | 63mm 90 Be | NULL  | 
| 16 |  18 | 75mm 90 Be | NULL  | 
| 17 |  18 | 90mm 90 Be | NULL  | 
| 18 |  18 | 110mm 90 Be | NULL  | 
| 19 |  18 | 125mm 90 Be | NULL  | 
| 20 |  18 | 160mm 90 Be | NULL  | 
+-----+----------+---------------+----------+ 

後查詢的輸出:

+-----+----------+---------------+----------+ 
| ID | SubCatID |  Item  | GroupID | 
+-----+----------+---------------+----------+ 
| 1 |  1 | 40mm Pipe | 2  | 
| 329 |  1 | 63mm Pipe | 3  | 
| 330 |  1 | 75mm Pipe | 4  | 
| 2 |  1 | 40mm Pipe | 2  | 
| 3 |  1 | 63mm Pipe | 3  | 
| 4 |  1 | 75mm Pipe | 4  | 
| 6 |  1 | 110mm Pipe | 6  | 
| 7 |  1 | 125mm Pipe | 7  | 
| 8 |  1 | 160mm Pipe | 8  | 
| 9 |  1 | 200mm Pipe | 9  | 
| 10 |  1 | 250mm Pipe | 10  | 
| 11 |  1 | 315mm Pipe | 11  | 
| 12 |  1 | 355mm Pipe | 12  | 
| 13 |  1 | 400mm Pipe | 13  | 
| 14 |  1 | 450mm Pipe | 14  | 
| 5 |  1 | 90mm Pipe | 5  | 
| 15 |  18 | 63mm 9B  | NULL  | 
| 327 |  61 | Stainless St | 20  | 
+-----+----------+---------------+----------+ 

這就是我想要的東西,但也有很多記錄,其中羣ID = NULL和大小= NULL。因此這些不會出現在結果中。所以我只希望GROUP BY出現在SubCatID = 1的地方

+3

能否請你幫我們一個大忙,並顯示你想要的精確的輸出? –

+0

不明白你爲什麼使用GROUP BY子句而沒有任何聚合函數。 @Tim是對的,輸出會有所幫助。 – Sergio

+0

編輯的帖子顯示我的查詢輸出 –

回答

0

你需要你使用HAVING。因此,像下面:

SELECT ID, SubCatID, Item, GroupID 
FROM StockItems 
GROUP BY GroupID 
HAVING SubCatID = 1 

MySQL Having

+0

感謝您的回答,但是這隻能說明記錄,其中SubCatID = 1,我要的是顯示所有記錄,但僅在SubCatID = 1的情況下出現GroupBy –

0

這是我結束了使用的解決方案:

SELECT ID, SubCatID, Item, GroupID, Size 
FROM StockItems 
WHERE (((GroupID IS NOT NULL OR GroupID <> 0) AND Def = 1) OR Size IS NOT NULL) AND Del=0 
GROUP BY GroupID, Size 
UNION ALL 

    SELECT ID, SubCatID, Item, GroupID, Size 
    FROM StockItems 
    WHERE (GroupID = 0 OR GroupID is Null) 
ORDER BY SubCatID, Size, Item+0, Item