2011-02-08 7 views
2

'でグループ' における相談クエリの改善:MySQLの - 私は 'でグループ' と問い合わせてい


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にもう1つのアイテム、例えば 'exccelent'、 'regular'などを含めるよう求めます。 php $ query [0] ['very_good']、$ query [0] ['good']、$ query [0] ['bad' ]など、他の項目に加えて、より多くの時間を費やしています。

結果を自動化するために、どのようにこのクエリを改善することができますか?

ありがとう、Vinicius。

+1

クエリにGROUP BYが表示されません。 –

+0

date_audienceによる必要があります... – erloewe

+0

date_audienceがインデックスに登録されていることを確認してください。また、/ sumを使用しないでください。プレーンカウント()でこのクエリを行うことができます – erloewe

答えて

1

2つのオプションがあります。

1)アプリケーションでそれを扱う。次のクエリは、データベースで必要な集計を実行し、各date_audience(quality_apurationの各値ごとに1つ)ごとに4行を返します。

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のために別の値を追加するたびに、あなたが持っているでしょうビュー定義を変更します。それでも、すべてのクエリを変更するよりも優れています。

関連する問題