2015-01-27 2 views
-1

У меня возникли проблемы с MySQL в разделе GROUP BY моего запроса. Существует столбец, который я хотел бы использовать в GROUP BY, но это должно использоваться только для определенного условия, которое зависит от значения в строке. Скажем, у меня есть эта таблица:GROUP BY при определенных условиях

mysql> SELECT * FROM test_table; 
+---+---+---+ 
| a | b | c | 
+---+---+---+ 
| 1 | 1 | 1 | 
| 2 | 1 | 2 | 
| 3 | 1 | 2 | 
| 4 | 2 | 2 | 
| 5 | 2 | 3 | 
| 6 | 3 | 1 | 
| 7 | 2 | 2 | 
+---+---+---+ 
7 rows in set (0.00 sec) 

Теперь я хотел бы получить все строки, где он должен использовать только GROUP BY на колонке с, когда б === 1. Это означает, что я хотел бы получить 6 строк назад, потому что строки с номерами 2 и 3 должны быть сгруппированы. Поэтому я придумал следующий запрос, который не дает мне ожидаемого результата.

mysql> SELECT * FROM test_table GROUP BY CASE WHEN b = 1 THEN c END; 
+---+---+---+ 
| a | b | c | 
+---+---+---+ 
| 4 | 2 | 2 | 
| 1 | 1 | 1 | 
| 2 | 1 | 2 | 
+---+---+---+ 
3 rows in set (0.00 sec) 

Я, вероятно, отсутствует что-то в пределах комбинации CASE заявления и GROUP BY, и я надеюсь, что любой из вас может помочь мне немного.

+3

Что такое ожидаемый результат? – axiac

+0

«Это означает, что я хотел бы получить 5 строк назад, потому что строки с номерами 2 и 3 должны быть сгруппированы». Таким образом, строка с '| 3 | 1 | 2 | 'должно быть« отсутствует » – LaVomit

+1

Конечно, я это увидел. Но это ничего не значит. Какие значения вы ожидаете получить от этой группы? Цель «GROUP BY» - не игнорировать строки, а вычислять агрегированные значения из групп строк. Если вы хотите игнорировать строку с 'a == 3', вы можете использовать' DISTINCT'. – axiac

ответ

0

Вы можете использовать простой GROUP BY пункт с колоннами b и c, разделенных запятой:

SELECT * 
FROM test_table 
GROUP BY CASE WHEN b=1 THEN c ELSE a END; 

Результат:

A B C 
1 1 1 
2 1 2 
4 2 2 
5 2 3 
6 3 1 
7 2 2 

видете в SQL Fiddle.

+1

Этот запрос может игнорировать строку '| 2 | 1 | 2 | '(и вместо этого возвращаем' | 3 | 1 | 2 | '). 'SELECT' в столбце (' a' в этом случае), который не входит в 'GROUP BY', и не зависит от функциональности, включая ошибку в стандартном' SQL'. Он принимается MySQL, но результатом является ** неопределенное поведение **. В документации [явно указано] (http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html): * «сервер может выбирать любое значение из каждой группы , поэтому, если они не совпадают, выбранные значения являются неопределенными »* – axiac

+0

Это не сделало бы трюк. Если бы была другая строка с b = 2 и c = 2, это было бы сгруппировано с строкой, где a = 4. – LaVomit

+0

Я обновил свою таблицу вопросов/примеров. Конечно, в моем случае это включает несколько 'JOIN' на разных таблицах, что сделало бы реальный запрос немного сложнее. Но я хотел бы немного понять, как это работает. Объяснение MySQL о 'CASE' и' GROUP BY' для меня недостаточно. – LaVomit

0

вам может понадобиться, чтобы сделать что-то на этих линиях в зависимости от вашей требуемой мощности

SELECT c, count(*) FROM test_table where b=1 GROUP BY c 
UNION 
SELECT c, count(*) FROM test_table where b<>1 
+0

Это дает мне ожидаемый результат , Хотя я хотел бы искать альтернативу использованию «СОЮЗА».Поскольку это относится к очень большим таблицам, для выполнения потребуется некоторое время. «UNION» сделает запрос примерно в два раза длиннее (со всеми «JOIN's et cetera»). – LaVomit

+0

какой столбец (ы) вы агрегируете ?, я просто использовал группу по с и количество строк. Пример. Не могли бы вы разместить свой необходимый результат? – Jayvee

Смежные вопросы