1
select id, name, 'First Category' as category, count(id) as totalCalls
from missed_call
where name = 'whatever1'
group by name, category
UNION
select id, name, 'Second Category' as category, count(id) as totalCalls
from missed_call
where name = 'whatever2'
group by name, category
order by name ASC, totalCalls DESC

前のクエリは、totalCallsが 0 のレコードを取得しません。

では、これらのレコードを取得してtotalCallsを 0 として表示するにはどうすればよいでしょうか?

更新: を変更しようとしcount(id) as totalCallsましIFNULL(count(id), 0) as totalCallsたが、問題は解決しません。おそらく、count(id) は実際には null ではないため、存在しないだけです。

4

3 に答える 3

3

データベーススキーマを拡張したくない場合は、いつでもテーブルがあるふりをすることができます:

select surrogateTable.name, 
       surrogateTable.Category, 
       count(id) as totalCalls
from 
(
  select 'whatever1' Name,
         'First Category' Category
  union all
  select 'whatever2',
         'Second Category'
) surrogateTable
left join missed_call
  on surrogateTable.Name = missed_call.Name
group by surrogateTable.name, surrogateTable.category

グループ化していないものを選択してはならないため、select で id を削除しました。これはおそらく MySql です。

Sql Fiddle でこれを確認してください

于 2012-05-16T08:18:06.537 に答える
1

問題は、カテゴリではなく不在着信のみを確認するため、対応する不在着信のないカテゴリに気付かないことです。

カテゴリ テーブルの実際の構造に適合させると仮定すると、これを実行するスケルトンが次のようになります。

SELECT ...
FROM Category cat
    LEFT JOIN missed_call call ON call.category = category.id
WHERE (call.name = 'whatever1' OR call.category IS NULL)
GROUP BY call.name, call.category
...

特に注意してくださいcall.category IS NULL。列はおそらく nullable ではありません。Categoryしたがって、これは対応する呼び出しのない行、つまり外部結合のアーティファクトを実際にチェックします。

于 2012-05-16T08:17:21.150 に答える
0

category可能なすべてのカテゴリ名の完全なリストを含む名前のテーブルを定義する必要があります。これには、呼び出しが割り当てられていない (つまり、ゼロの) カテゴリも含まれます。

create table category
(
    id  numeric(10,0) NOT NULL,
    name    varchar(10) NULL
)

次に、このテーブルからカテゴリの完全なリストをクエリし、上から得たものに対して結果を LEFT JOIN できます。

missed_call次に、新しいテーブルに対して外部キーを使用するように修正して、category効率とスキーマ設計を向上させることができます

create table missed_call
(
    id  numeric(10,0) NOT NULL,
    first_category_id numeric(10,0) NULL,
    second_category_id numeric(10,0) NULL,
    name  varchar(12)
)
于 2012-05-16T08:17:34.393 に答える