我有一个'group by'的查询:
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']等,添加其他项目,花费更多时间。
有没有人知道如何改进此查询,以便自动化结果?
谢谢,Vinicius。
答案 0 :(得分:1)
我可以看到两个选项。
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)在数据库中处理。您可以定义如下视图:
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添加另一个值时,您都必须修改视图定义。不过,它比修改所有查询更好。