Mysql - Улучшение запроса на консультацию в 'group by' - PullRequest
2 голосов
/ 08 февраля 2011

У меня есть запрос с '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 еще один элемент, например: «отлично», «регулярно» и т. Д. И мне также придется настроить планируйте как php $ query [0] ['very_good'], $ query [0] ['good'], $ query [0] ['bad'] и т. д., добавляя среди других элементов, тратя больше времени.

Кто-нибудь знает, как я могу улучшить этот запрос, чтобы автоматизировать результаты?

Спасибо, Виниций.

1 Ответ

1 голос
/ 08 февраля 2011

Я вижу два варианта.

1) Работа с ним в приложении .Следующий запрос выполнит необходимую агрегацию в базе данных и вернет 4 строки для каждого date_audience (по одной для каждого значения 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, вам придется изменить определение представления.Тем не менее, это лучше, чем изменять все запросы.

...