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

标签 sql mysql group-by sum

我有一个“分组依据”的查询:


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'] 等,添加其他项目,花费更多时间。

有谁知道我该如何改进这个查询,以便自动生成结果?

谢谢,维尼修斯。

最佳答案

我可以看到两个选项。

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/

相关文章:

sql - 在存储过程中使用循环

php - MySQL 查询为我正在制作的论坛创建 "bump-system"

php - 按结果分组为多维数组

mysql - 如何从列中获取唯一值,同时返回最新的非唯一值

mysql - 基于事件将三张表的数据汇集到一张表中

sql - 内部联接 - 使用相同联接的两个值!

mysql - 如何修复 mysql 查询出错的问题

r - 如何在 R 中仅提取分组项的第一行?

mysql - 仅限脚本关系 SQL Server

mysql - 一般 MYSQL 数据库了解