2017-07-20 24 views
0

以下のようなMysqlテーブルがあります。クロス集計クエリのフィルタリング

enter image description here

私はFIELD_1 =冬を持つユーザーのためのクロス集計/ピボット形式ですべてのユーザーデータを取得するためにテーブルの上にクエリを実行します。

私は任意のフィルタなしでクロス集計クエリを作成する方法を知っている:私はのためにFIELD_1 =「夏USER_2をフィルタリングしたいのに対し、

SELECT `user_id`, 
    GROUP_CONCAT(CASE WHEN `field_id` = 'field_2' THEN `field_value` ELSE NULL END) AS field_2, 
    GROUP_CONCAT(CASE WHEN `field_id` = 'field_3' THEN `field_value` ELSE NULL END) AS field_3 
FROM `my_table` 
GROUP BY `user_id` 

enter image description here

しかし、すべてのユーザーが上記のクエリの結果'

上記の結果セットでPHP forループを実行することはできますが、PHP forループを使用せずにMySqlクエリを使用するより効率的な方法があるのだろうかと思いました。

私はfield_idとデータの何千もの行の約10の異なる値を持っているので、効率が大きな懸念事項です。

答えて

1

私はあなたがフィールドの夏にあなたが少なくとも1つの行を持っているもののみのuser_idをしたいと主張しhaving句を使用することができると思う1.

SELECT `user_id`, 
    GROUP_CONCAT(CASE WHEN `field_id` = 'field_2' THEN `field_value` ELSE NULL END) AS field_2, 
    GROUP_CONCAT(CASE WHEN `field_id` = 'field_3' THEN `field_value` ELSE NULL END) AS field_3 
FROM `my_table` 
GROUP BY `user_id` 
having sum(field_id = 'field_1' and field_value = 'Summer') > 0; 
+0

パーフェクト、おかげでたくさんの(4分で答えを受け入れます、それは私を許可するとき)。サイドクエリは、行の数が何千にもなると、これがPHP forループ(このような配列を構築する)と比較してより高速になると思いますか? – abdfahim

+1

私は「はい」と言います。集約操作は、DBレベルで高速にする必要があります。このデータがリアルタイムでない場合は、バッチで処理し、集約結果を事前に準備し、直接フェッチして表示することができます。 – GurV

関連する問題