2011-02-11 14 views
1

私はdrupal6/PHP5用のモジュールをMySQL(およびオプションでPostgreSQL)を使用して作成しています。複数の行を可変長の単一の行に変換するためのSQL

これらのフィールドを参照する値(lid、pid、fid、numval、stringval)のフィールドのテーブル(fid、name、type、class ...)とパラメータテーブルを持っています。 )。 パラメータは数値(FLOAT/REAL)または文字列値(TEXT)のみですが、 (フィールド "タイプ"による)ではありません。

与えられた「ふた」には、ループ内の行として簡単に取り出すことができる複数の/可変数のパラメータ/行があります。私がしたいのは、単一の 行の "値"を取得することです。各行の見出しには、関連するフィールド名が入ります。 このようなクエリでは、すべてのフィールド:値のペアがオブジェクト属性として返されます:値 が1つのデータベース呼び出しでペアになります。

Googleは、複数の行を1行にまとめたSQLの例をいくつか見つけましたが、 結果セット内の固定数の列/フィールドのあらかじめ決められたラベル付けを前提としているようです単一の複合「名前:値」ストリングとしての列項目。 私は、 フィールドの任意の数値に対してより一般的なアプローチがあると思っています。これはMySQLとPostgreSQLの両方で機能しますか?

私は非常に基本的なSQLエクスペリエンスしか持っていないので、ビューやテンポラリテーブルや、プロシージャの定義と実行に関することはできません。

ありがとうございました。単一の行を返すいくつかの選択LID = 1つの発現と

例として

FIELDS 
FID NAME  TYPE CLASS  WIDGET SIZE UNITS DESCRIPTION ..... 
1  voltage float instrument text 10 
2  current float instrument text 10 
3  size  float sample  text 10 
4  colour text sample  text 30 
... 

PARAMS 
PID LID FID NUMVAL STRINGVAL 
1 1  1  2.5  NULL 
2 1  4  NULL 'blue' 
3 2  1  2.7  NULL 
4 2  2  13  NULL 
5 2  3  27  NULL 
6 2  4  NULL  'greenish blue' 

| voltage | colour | 
----------------------- 
| 2.5 | 'blue' | 

セレクトLID = 2

| voltage | current | size | colour  | 
------------------------------------------------ 
| 2.7 | 13  | 27 | 'greenish blue' | 
+1

サンプルデータと結果の表示方法を教えてください。 –

+0

完了。乾杯。実際には、私はFIELDSには約30行、PARAMSには100万以上のものしかないと思います。さまざまな条件/機器/使用状況によって、異なるフィールドが記録/要求されます。 – doobs

+0

おめでとう、あなたはEAVの亜種を再発見しました。ほとんどのリレーショナルデータベースではうまく機能しません。すべてのデータを1つのテーブルにまとめる理由はありますか? –

答えて

0

これは、データを表示します水平方向ではなく垂直方向です。

SELECT 
    FIELDS.NAME AS PROPERTYNAME, 
    CASE WHEN PARAMS.NUMVAL IS NULL THEN STRINGVAL ELSE CAST(PARAMS.NUMVAL AS VARCHAR(100)) END AS PROPERTYVALUE 
FROM 
    PARAMS, FIELDS 
WHERE 
    PARAMS.FID = FIELDS.FID 
     AND 
    PARAMS.LID = 1 
ORDER BY 
    PARAMS.FID 

SQLには微妙な調整が必要な場合がありますが、DBスキーマにアクセスすることができない限りできます。

+0

ありがとうございます。私は**私が探しているものはこれです:[リンク](http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#523) "ピボットテーブルのクエリを自動化する" – doobs

0

ピボットテーブルのものはちょっと混乱しているようです。 私はちょうどこの (おかげでジョンはCASEを使用する方法を私を示すために選ぶ!)のような単純なもので行くことに考えています:PHPで)

SELECT p.l_id, 
    GROUP_CONCAT(
     CONCAT(f.name,'=', 
      CASE WHEN p.stringval IS NULL 
       THEN p.numval 
      ELSE p.stringval 
      END 
     ) SEPARATOR '||' 
    ) AS vals 
FROM 
    params AS p 
LEFT JOIN fields AS f 
    ON p.f_id=f.f_id 
WHERE 
    p.l_id=1 
GROUP BY 
    p.l_id; 

だけ後処理(爆発と「ヴァルス」の文字列。

+------+---------------------------------------------------------- ... -+ 
| l_id | vals               | 
+------+---------------------------------------------------------- ... -+ 
| 1 | kv=50||ma=50||pressure=0||temp_ccd=-58||temp_sample=150|| ... | 
+------+--------------------------------------------------------- ... + 

与えられたより正確な解決策が、正しいフォーマットのカラムを返すために必要なすべての情報がPARAMS AND FIELDSテーブルにあることを期待しました。そして、今では文字列型の文字列である をセパレータで区切って心配する必要があります: -/

関連する問題