2013-07-10 4 views
4

Есть ли способ сделать предложение if in group by?mysql IF в GROUP BY статья

У меня есть запрос, где я хочу, чтобы сгруппировать результат на основании значения столбца

, если столбец является Null, я хочу, чтобы результат останется, как это, но если нет, то я хочу, чтобы сгруппировать его по этой ценности? Как ты это делаешь?

редактировать: жаль, что я думаю, что я должен поставить более конкретный пример

приведенные ниже столбцы содержит идентификатор категории, нитки и ответ

это на форуме

те, с нулевыми значениями средств они не имеют никакого ответа на них

если ответ является недействительным, я не хочу, чтобы сгруппировать его

цели для подсчета ответов и нити внутри категории

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

| category | thread | reply | 
------------------------------- 
| 1  | 1  | 1  | 
| 1  | 1  | 2  | 
| 1  | 2  | 3  | 
| 2  | 3  | 4  | 
| 3  | 4  | 5  | 
| 3  | 4  | 6  | 
| 4  | 5  | null | 
| 5  | 6  | null | 

затем результатом будет

| category | thread | reply | 
----------------------------- 
| 1  | 3  | 3  | 
| 2  | 1  | 1  | 
| 3  | 2  | 2  | 
| 4  | 1  | null | 
| 5  | 1  | null | 
+0

просто используйте группу, я не думаю, что необходимо проверить, является ли это нулевым или нет. –

+0

вы должны показать нам соединение, которое вы используете для получения этого результата, это можно сделать на этом соединении. – mirkobrankovic

ответ

0

MySQL будет группировать все строки с fr = null в один, как если бы это было нормальное значение.

Чтобы решить вашу проблему, я бы сделал дополнительный выбор вашей таблицы, где новый столбец либо получил значение fr (в случае, если оно не является нулевым), либо увеличенное значение из нормального объема fr, возможно отрицательные числа. А затем сделайте внешнюю группу выбора на этом новом виртуальном столбце.

set @i := 0; 

select if(virtualFR<0,null,virtualFR) as fr, sum(fr_sum) from 
(select *, if(fr is null,@i:[email protected],fr) as virtualFR from myTable) virtual 
group by virtualFR; 

sqlfiddle

0

Вы можете просто сделать это:

select min(id) id, sum(fr_sum) fr_sum, fr 
from mytable 
group by 3 
1

Если я правильно Вас понял попробовать этот способ:

(
SELECT category, COUNT(thread) AS thread, COUNT(reply) AS reply 
    FROM test 
    WHERE reply IS NOT NULL 
    GROUP BY category 
) 
UNION ALL 
(
SELECT category, COUNT(thread) AS thread, reply 
    FROM test 
    WHERE reply IS NULL 
    GROUP BY category 
) 
ORDER BY category 

SQL Fiddle

+0

Я попробую это, надеюсь, что это сработает, у меня довольно сложный запрос, на данный момент я использую несколько таблиц просмотра в качестве временного решения, но я хочу, чтобы лучший запрос использовался – user949000

13

Вы на самом деле может включать в себя сазе в GROUP BY или ORDER BY пункте:

ORDER BY CASE 
      WHEN reply IS NULL THEN 1 
      ELSE 0 
     END, category 
+0

. Я не знал, что, спасибо, попробует это :) – user949000

2

По mysql 5.6 вы можете использовать IF() в предложении order by.

Как это:

ORDER BY IF(reply=NULL, 1, 0), category 

Может быть не правильный ответ для вашего конкретного случая, но удобно для других людей, которые ищут что-то вроде этого.