2011-12-16 4 views
2

に追加:SQL構文は、によって、グループをカウントし、私はこの(使用してMySQL 5.5.15)のようなSQL文の持つ声明

select global_id, count(id) as group_count 
from globals_lists 
group by global_id 
order by group_count desc; 

をし、文のでサブセットをサポートするためにそれを変更したいですこのように:

select global_id, count(id) as group_count 
from globals_lists 
where global_id in (3,4,5,6) 
group by global_id 
order by group_count desc; 

私は、結果として得られます。

global_id group_count 
3   15 
5   12 

が、

したいと思います
global_id group_count 
3   15 
5   12 
4   0 
6   0 

これは可能ですか?私はいくつかの条項を持っていましたが、それを働かせるようには見えませんでした。

答えて

2

をそれは見て少し厄介ですが、どの程度?

select IDs.ID, ifnull(count(globals_lists.global_id),0) as group_count 
from (select 3 as ID 
      UNION select 4 
      UNION select 5 
      UNION select 6) as IDs 
left join globals_lists on IDs.ID = globals_lists.global_id 
group by IDs.ID 
order by group_count desc; 
+0

によって回答されているように見えます。 '*'の代わりに 'global_lists'テーブルから列を数えます。 – timpone

+0

'COUNT(*)' '左join'にマッチしていない行に対して1を返しますような何かを恐れていた別の... – Andomar

+0

@Andomar - 偉大なキャッチ –

0

代わりのCOUNT(id)、それは、カウントを返しますCOUNT(*)を使用どれも存在しない場合でも、4 & 6と仮定すると存在しています:

select global_id, count(*) as group_count 
from globals_lists 
where global_id in (3,4,5,6) 
group by global_id 
order by group_count desc; 
+0

5と6が存在しない場合は解決策がありますか? – timpone

+0

@timponeはい、他のリテラルを結合する必要があります。それは私がこの –

1

すべての値を含む表を追加できます。以下のようなインライン、または一時テーブル。次に、left joinを使用して行数を一致させることができます。

select lst.nr 
,  count(gl.id) as group_count 
from (
     select 3 as nr 
     union all select 4 
     union all select 5 
     union all select 6 
     ) lst 
left join 
     globals_lists gl 
on  lst.nr = gl.global_id 
group by 
     lst.nr 
order by 
     count(gl.id) desc 
+0

標準結合を超えるこのようなクエリではパフォーマンス上の懸念はありますか? – timpone

関連する問題