2013-07-10 51 views
4

if在group by子句中有辦法嗎?mysql如果在group by子句中

我有一個查詢,我想對結果進行分組基於列

如果列是空的值,我想要的結果,以保持原樣,但如果沒有,我希望將它通過那個價值?你是怎樣做的?

編輯:對不起,我想我應該把更具體的例子

下面列包含類,線程的ID和回覆

它是一個論壇

的那些具有空值的方法他們沒有在他們組的任何回覆

如果回答是空的,我不希望它

的目的是爲了答覆和線程計數類

我沒有設定回覆爲空值內,他們都是這樣的,因爲一個結果的加入

| 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

只是使用組,我不認爲有必要檢查它是否爲null。 –

+0

您必須向我們展示您用於獲取該結果的連接,它可以在該連接上完成。 – mirkobrankovic

回答

0

MySQL將fr = null的所有行合併爲一個,就像它是一個正常值一樣。

爲了解決你的問題,我會做一個子選擇你的表,其中一個新的列或者得到了fr的值(在它不是null的情況下)或者增加值超出了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 CASE語句或ORDER BY子句:

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

我不知道,謝謝,會試試這個:) – user949000

2

由於mysql 5.6你可以在order by子句中使用IF()。

像這樣:

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

也許不適合你的具體情況正確的答案,但方便其他人搜索這樣的事情。