2012-06-07 18 views
21

として別の列Iは、ユーザ情報のレガシー・テーブルを有する(すなわち、アクティブに使用中である)とIがの構造を変更できないように動的な行値を選択しますの/ etc国の名前の唯一の例であり、彼らは可変とすることができます/その列の列にユニーク以外の有限のリストがありませんMySQLは、カラム名、値

私は戻ってくるのMySQL互換性のSQLクエリ必要 -

id timezone  language country something 
--------------------------------------------------- 
0  Europe/London en   45  x 
1  Europe/Paris fr   46 

私は、MySQLへのPivotテーブル機能のハッキングに関するstackoverflowに関するさまざまな答えを見てきましたが、同じテーブルの列からの一意の行値からの可変列名エイリアスを使用するこのケースと一致するものはありません。私はほとんど眠れませんでしたので、彼らはすべてぼんやりとしたものになり始めています。事前にお詫び申し上げます。私は見つけることができる

最も近い同じテーブルクエリに最初のname列からすべての可能な/一意の値を取得し、CASE WHENを使用するクエリを建設するプリペアドステートメントhttps://stackoverflow.com/a/986088/830171、および/または複数のサブSELECTまたはJOINを使用することです。

私は、そのユーザーIDのすべての行を取得し、forループでアプリケーション自体で処理するか、名前を有限量に制限してサブを使用しようとします。SELECT s/JOIN s。しかし、新しい名前が追加された場合、このクエリを再訪しなければならない場合、2番目のオプションは理想的ではありません。

私はいくつかの他のRDBMS MySQLは、設計によってこの種の操作を旋回させるためのネイティブサポートを持っていないとは違って(開発者ではなく、それがプレゼンテーションに適しだと感じ

+0

これは本当に 'sql'で表現する必要がありますか、あるいは選択したプログラミング言語で後処理で十分ですか? de-fungledデータに参加する必要がある場合、ビュー/ procがトリックかもしれません。 – bluevector

+0

Yeh私は今、アプリケーションレベルで混乱を避けていきます - 私は、そのユーザーIDのすべての行を取得し、連想配列にデータを入れてループします。私はそれが唯一の良いオプションであることを確認したかった。移行と一度限りのレポートのためのSQLメソッドを持つことは非常に便利です。 – gingerCodeNinja

答えて

39

何かを明らかに見逃しているを教えてくださいデータベース、アプリケーションのレイヤよりも)。

あなたは絶対にプリペアドステートメントを構築し、MySQLの中にそのような操作をperfom必要がある場合は、私はおそらくちょうどMySQLのGROUP_CONCAT()機能を使用したい、というもののCASEをいじりよりも—を移動するための方法である:

SELECT CONCAT(
    'SELECT `table`.id', GROUP_CONCAT(' 
    , `t_', REPLACE(name, '`', '``'), '`.value 
     AS `', REPLACE(name, '`', '``'), '`' 
    SEPARATOR ''), 
' FROM `table` ', GROUP_CONCAT(' 
    LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '` 
      ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id 
      AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name) 
    SEPARATOR ''), 
' GROUP BY `table`.id' 
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t; 

PREPARE stmt FROM @qry; 
EXECUTE stmt; 

参照してください。それはsqlfiddleです。 GROUP_CONCAT()の結果はgroup_concat_max_len変数によって制限されること

ノート(1024バイトのデフォルト:あなたは、いくつかの非常に長いname値を持っていない限り、ここでは関係なさそう)。

+4

うわー - すべての努力をして解決策を書いてテストしてくれてありがとう。とても有難い。私はいつもこのタイプのクエリを作成する方法を知りたいと思っていました。それは私が想像するほど複雑に見えます。今のところ、アプリケーションレベルで扱いにくいことがありますが、このクエリは、レポートや移行のために非常に便利です。ありがとう。 – gingerCodeNinja

+0

私は非常に似たようなシナリオを持っています。あなたの優れた例を使って、ピボット表示された結果がきれいに表示されます。しかし、私はそれからチャートを生成したいので、結果をテーブルに格納する必要があります。ピボットされた結果をテーブルに格納することは可能ですか?また、上記のPHPで実行することは可能ですか?私のソーステーブルはユーザー、日付、パフォーマンス、ピボットは、行としてのユーザー、列としての日付、セル値としてのパフォーマンスです。 – Sri

+0

私のサンプルテーブルをsqlfiddleに入れてください(http://sqlfiddle.com/#!2/06be4/1を参照してください) – Sri

関連する問題