3

問題があり、私の SQL は基本的すぎて解決できません。
私は2つのテーブルを持っています:

表1

  • id (整数) - (主キー)
  • 電子メール (文字)
  • 他の分野...

表2

  • id (int) - (これは主キーでも一意でもありません。これは に関する外部キーですTABLE1.id)
  • キー (文字)
  • 値 (文字)
  • 他の分野...

2 番目のテーブルの構造は「key-value」です。

ごとに、 withTABLE1.idに「多くの」行があります。特に、次のような状況が発生する可能性があります。TABLE2TABLE1.id == TABLE2.id

TABLE1 の行

id = 10, email = "albert.einstein@genius.com", (other fields omitted)...

TABLE2 の対応する行

id = 10, key = "first_name", value = "Albert", (other fields omitted)...
id = 10, key = "last_name", value = "Einstein", (other fields omitted)...

TABLE3次の構造を持つテーブルを返すことができる SQL クエリを書きたいと思います。

表3

  • id (整数)
  • 名 (文字)
  • last_name (文字)
  • 電子メール (文字)

TABLE3には、 に存在する各行の行が含まれている必要があり、およびTABLE1で順序付けする必要がありlast_nameますfirst_name

例に従って、次のような行を含むテーブルを取得する必要があります。

id = 10, first_name = "Albert", last_name = "Einstein", email = "albert.einstein@genius.com"

私は夢中になっています!!!

4

1 に答える 1

3

これらのキーと値のペアを列にピボットする必要があります。残念ながら、MySQL にはピボット テーブル演算子がありません。ただし、CASE式を使用してそうすることができます。

SELECT
  t1.id,
  MAX(CASE WHEN t2.key = 'first_name' THEN value END) AS first_name,
  MAX(CASE WHEN t2.key = 'last_name' THEN value END) AS last_name,
  t1.email
FROM table1 AS t1 
INNER JOIN table2 AS t2 ON t1.id = t2.id
GROUP BY t1.id,
         t1.email;

SQL フィドルのデモ


これを動的に行い、これらすべての値を手動で書きたくない場合は、動的 SQL を使用してこれを行う必要があります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(t2.key = ''',
      t2.key, ''', t2.value, 0)) AS ', '''',   t2.key, '''')
  ) INTO @sql
FROM table2 AS t2;

SET @sql = CONCAT('
  SELECT
    t1.id,', @sql, ',
    t1.email
  FROM table1 AS t1 
  INNER JOIN table2 AS t2 ON t1.id = t2.id
  GROUP BY t1.id, t1.email');

prepare stmt 
FROM @sql;

execute stmt;

SQL フィドルのデモ

于 2013-03-20T19:03:29.040 に答える