Mysql - 改进'group by'中的咨询查询

时间:2011-02-08 15:00:33

标签: sql mysql group-by sum

我有一个'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/):

Table Results

由于表X具有另一个表Y的外键,最终有人会要求在表Y中再包含一个项目,例如:'exccelent','regular'等。我还需要调整安排为php $ query [0] ['very_good'],$ query [0] ['good'],$ query [0] ['bad']等,添加其他项目,花费更多时间。

有没有人知道如何改进此查询,以便自动化结果?

谢谢,Vinicius。

1 个答案:

答案 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添加另一个值时,您都必须修改视图定义。不过,它比修改所有查询更好。