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 totalCallsIFNULL(count(id), 0) as totalCalls但它不能解决问题。也许,因为 count(id) 实际上不为空,它只是不存在。

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。该列应该是不可为空的;所以这确实检查了Category没有任何相应调用的行,这是外部连接的工件。

于 2012-05-16T08:17:21.150 回答
0

您应该定义一个名为的表category,以包含所有可能的类别名称的完整列表,即使是那些没有分配给它们的调用(即零)。

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

然后,您可以从该表中查询完整的类别列表,并将结果与​​上面的结果进行左连接。

然后,您可以修改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 回答