【问题标题】:Mysql - Improving consultation query in 'group by'Mysql - 改进'group by'中的咨询查询
【发布时间】:2011-02-08 15:00:33
【问题描述】:

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


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

有没有人知道我可以如何改进这个查询,以自动化结果?

谢谢,维尼修斯。

【问题讨论】:

  • 我在您的查询中没有看到任何 GROUP BY。
  • 确保 date_audience 已编入索引。另外,不要使用 if/sum。您可以使用普通 count() 进行此查询
  • 我认为任何自动化的尝试都需要构建动态 SQL。

标签: sql mysql group-by sum


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

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多