2016-07-13 2 views
1

я в следующей таблице «StockItems» (упрощенный для данного примера):Mysql - Выберите утверждение, Группировать для записей, которые соответствуют критериям

+----+----------+---------+---------+---------+-----+ 
| 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 является элементом Default в GroupID, а Del означает Deleted

Это работает, но мне нужен еще один шаг для достижения результатов, которые я хочу: я не хочу извлекать записи с тем же идентификатором GroupID и Size WHERE SubCatID = 1

Если GroupID и размер одинаковы для любого GroupID я хочу, чтобы получить запись, где Def = 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  | 
+-----+----------+---------------+----------+ 

Это то, что я хочу, но есть много записей, где GroupID = 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, что я хочу, чтобы показать все записи, но имеет место только GroupBy, где SubCatID = 1 –

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 
Смежные вопросы