-1

このクエリを作成する方法が思いつかないリレーショナル DB があります。

ここに情報があります

表1

ID名
1 マイク

表2

id table_1_id 値の設定
1 1 何かの設定1
2 1 何か2 設定2
2 1 何か3 設定3

現在、これは私のSQLクエリです

SELECT *  FROM Table1
JOIN Table2 on Table2.table_1_id = Table1.id

これが出力するものはこのようなものです

id名 table_1_id値設定
1 マイク 1 何か 1 設定 1
1 マイク 1 何か 2 設定 2
1 マイク 1 何か 3 設定 3

これらの結果を返すような方法でこれを構築して、CSV ファイルにエクスポートできるようにすることは可能ですか?

ID名 table_1_id something1 something2 something3
1 マイク 1 設定 1 設定 2 設定 3

4

4 に答える 4

2
SELECT
    Table1.*,
    something1Table.setting AS something1,
    something2Table.setting AS something2,
    something3Table.setting AS something3
FROM Table1
JOIN Table2 AS something1Table ON something1Table.table_1_id = Table1.id AND something1Table.value = 'something'
JOIN Table2 AS something2Table ON something2Table.table_1_id = Table1.id AND something2Table.value = 'something2'
JOIN Table2 AS something3Table ON something3Table.table_1_id = Table1.id AND something3Table.value = 'something3'
于 2013-01-13T19:27:43.960 に答える
1

条件付き集計が必要です。

select table1.id, table1.name,
       max(case when value = 'something1' then setting end) as setting1,
       max(case when value = 'something2' then setting end) as setting2,
       max(case when value = 'something3' then setting end) as setting3
from table1 join
     table2
     on table1.id = table2.id
group by table1.id, table1.name
于 2013-01-13T19:26:08.733 に答える
1

このタイプのデータ変換はピボットとして知られてますが、MySQL にはピボット機能がありません。したがって、式を含む集計関数を使用して複製する必要がありCASEます。

値の数が事前にわかっている場合は、次のようなクエリをハードコーディングできます。

select t1.id, 
  t1.name,
  max(case when t2.value = 'something' then t2.setting end) as setting1,
  max(case when t2.value = 'something2' then t2.setting end) as setting2,
  max(case when t2.value = 'something3' then t2.setting end) as setting3
from table1 t1
left join table2 t2
  on t1.id = t2.table_1_id
group by t1.id, t1.name;

デモで SQL Fiddle を参照してください

ただし、列に変換する値の数が不明な場合は、準備済みステートメントを使用して動的 sql を生成できます。

クエリは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when t2.value = ''',
      value,
      ''' then t2.setting end) AS `',
      value, '`'
    )
  ) INTO @sql
FROM  table2;

SET @sql = CONCAT('SELECT t1.id, 
                    t1.name, ', @sql, ' 
                  FROM table1 t1
                  left join table2 t2
                    on t1.id = t2.table_1_id
                  group by t1.id, t1.name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

デモで SQL Fiddle を参照してください

両方のバージョンの結果は次のとおりです。

| ID | NAME | SOMETHING | SOMETHING2 | SOMETHING3 |
---------------------------------------------------
|  1 | Mike |  setting1 |   setting2 |   setting3 |
于 2013-01-13T19:52:38.397 に答える
0

GROUP_CONCAT が役立つ場合があります。連結された値が単一のフィールドに入れられるため、必要なものが正確に得られるわけではありません。しかし、実際に達成しようとしていることに応じて、おそらくそれを回避できます。GROUP_CONCAT の利点は、table1 の行ごとに任意の数の table2 の行を処理できることです。一方、3 つのエントリを持つハードワイヤー上の条件付き集計 (これはおそらく必要な場合があります) です。

SELECT table1.*, 
    GROUP_CONCAT(value) AS value_group,
    GROUP_CONCAT(setting) AS setting_group 
FROM table1
INNER JOIN table2
ON table2.table_1_id = table1.id

戻り値

id,person,value_group,setting_group
1,Mike,"something1,something2,something3","setting1,setting2,setting3"
于 2013-01-13T19:35:20.440 に答える