2015-10-13 53 views
1

我有表 「對象」:MySQL的COUNT與group by或不同

id (int) 
name (varchar) 
group_id (varchar) default null 

我做一些刀片:

insert into objects values 
(null, 'Cat', null), 
(null, 'Dog', null), 
(null, 'Mouse', 'AAA'), 
(null, 'Eagle', 'BBB'), 
(null, 'Elephant', null), 
(null, ' Bull', 'AAA'); 

我需要計數行的總數。但是,group_id爲「AAA」的兩行應合併爲一行。 在上面的例子中,「count」應該返回「5」。這是因爲:

  • 有3行與激磁NULL值 「GROUP_ID」
  • 有1個與GROUP_ID 「BBB」 的行的 「occurence」
  • 有1行的 「occurence」與group_id「AAA」

用group_id做一個計數似乎不是解決方案,因爲它返回3行,併爲每行提供一個計數。我只需要行數的總數。

使用DISTINCT似乎也沒有幫助。查詢:

select count(distinct(group_id)) from objects; 

返回一行與值 「2」

+0

怎麼ID可以爲空?那不應該是null –

+1

@bluto它是一個自動遞增整數 – Strawberry

回答

2

使用組通過用條件:

SELECT COUNT(*) FROM objects 
GROUP BY CASE 
    WHEN group_id IS NULL THEN id 
    ELSE group_id 
    END 
+0

但這不會返回5 –

+0

你測試過嗎?它只是不符合要求的結果 - '我只需要總行數.'和'在上面的例子中,「count」應該返回「5」。 ' –

+0

你能解釋爲什麼這是公認的答案嗎? –

2

COUNT()只增量NON_NULL值,因此

select count(distinct IFNULL(group_id,'-9nTfx')) from objects; 

將返回3從您的樣本數據爲1'AAA''BBB'和NULL。

你所要求的5的結果,所以我的建議是:

select 
    count(distinct group_id) 
    + count(case when group_id IS NULL then 1 end) 
from objects; 
  • 請注意,DISTINCT不是一個函數,所以當你寫 DISTINCT(GROUP_ID)的括號會被忽略。這也是 真正的「選擇不同(somecolumn)」的方式。

@used_by_already解釋得很好。我剛剛做這個演示中給出的打擊

SEE WORKING DEMO IN ACTION

0

這第二個答案存在,作爲審議的測試結果。

This SQL Fiddle

的MySQL 5。6架構設置

查詢2

SELECT COUNT(*) FROM objects 
GROUP BY CASE 
    WHEN group_id IS NULL THEN id 
    ELSE group_id 
    END 

Results

| COUNT(*) | 
|----------| 
|  1 | 
|  1 | 
|  1 | 
|  2 | 
|  1 |