我有一个“分组依据”的查询:
SELECT date_audience,
Sum( If( quality_apuration = '1', 1, 0 ) ) AS very_good,
Sum( If( quality_apuration = '2', 1, 0 ) ) AS good,
Sum( If( quality_apuration = '3', 1, 0 ) ) AS bad,
Sum( If( quality_apuration = '4', 1, 0 ) ) AS no_apuration,
Count(quality_apuration) AS total
FROM pp_base
WHERE date_audience >= '2011-01-01' AND date_audience <= '2011-02-28'
GROUP BY date_audience ORDER BY date_audience ASC
在哪里返回以下结果(或参见 http://jsbin.com/imuru5/ ):
由于表X有另一个表Y的外键,最终有人会要求在表Y中添加一个项目,例如:'exccelent','regular'等。我也必须调整计划为 php $query[0]['very_good']、$query[0]['good']、$query[0]['bad'] 等,添加其他项目,花费更多时间。
有谁知道我该如何改进这个查询,以便自动生成结果?
谢谢,维尼修斯。
最佳答案
我可以看到两个选项。
1)在应用中处理。以下查询将在数据库中执行必要的聚合,并为每个 date_audience 返回 4 行(每个 quality_apuration 值一个)。
select date_audience
,quality_apuration
,count(*)
from pp_base
where date_audience >= date '2011-01-01'
and date_audience <= date '2011-02-28'
group
by date_audience
,quality_apuration
order
by date_audience
,quality_apuration;
当您希望更改 quality_apuration 值时,这是首选。
2) 在数据库中处理。您可以定义如下 View :
create or replace view pp_view as
select date_audience
,sum(case when quality_apuration = '1' then 1 else 0 end) as very_good
,sum(case when quality_apuration = '2' then 1 else 0 end) as good
,sum(case when quality_apuration = '3' then 1 else 0 end) as bad
,sum(case when quality_apuration = '4' then 1 else 0 end) as no_apuration
,count(quality_apuration) as total
from pp_base
group
by date_audience;
...然后您将从应用程序中选择如下:
select ...
from pp_view
where date_audience >= date '2011-01-01'
and date_audience <= date '2011-02-28'
order
by date_audience;
当然,无论何时为 quality_apuration 添加另一个值,都必须修改 View 定义。不过,这总比修改所有查询要好。
关于sql - Mysql - 改进 'group by'中的咨询查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934628/