0

私は2つのテーブルを持っています

表1

===================================
= Id = Name             =  email  =
===================================
= 1  = David            = d@d.com =
===================================

表 2

==================================
= uid = key        =  Value      =
==================================
= 1   = Age        =  18         =
= 1   = Tele       =  0123456798 =
==================================

アイデアは、UID が Id に関連してテーブルをリンクするというものです。

私がやりたいことは、次の出力を取得するために 1 つの SQL クエリを実行することです。

=========================================================================
= Id = Name             =  email  = age        =  Tele                  =
=========================================================================
= 1  = David            = d@d.com = 18         = 012345678              =
=========================================================================

実行する必要があるクエリは何ですか。

ありがとう

4

4 に答える 4

2

あなたはすでに回答を受け入れていますが、別の解決策を提供するためにこれを投稿しています。データを取得しようとしていますが、MySQL にはピボット関数がないため、ステートメントPIVOTで集計関数を使用できます。CASE

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

select t1.id,
    t1.name,
    t1.email,
    MAX(CASE WHEN t2.key='age' THEN t2.value ELSE NULL END) AS age,
    MAX(CASE WHEN t2.key='tele' THEN t2.value ELSE NULL END) AS tele
FROM Table1 t1 
LEFT JOIN Table2 t2 
  ON t1.Id = t2.uid
GROUP BY t1.id, t1.name, t1.email

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

ただし、値の数が不明な場合はkey、準備済みステートメントを使用して動的 SQL バージョンを作成することをお勧めします。

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

SET @sql = CONCAT('SELECT t1.id, t1.name, t1.email, ', @sql, ' 
                  FROM table1 t1
                  left join table2 t2
                    on t1.id = t2.uid
                  GROUP BY t1.id, t1.name, t1.email');

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

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

結果:

| ID |  NAME |   EMAIL | AGE |      TELE |
------------------------------------------
|  1 | David | d@d.com |  18 | 123456798 |

どちらも同じ結果を生成しますが、準備済みステートメント バージョンはkey実行時に値のリストを生成します。

于 2012-12-13T18:16:17.547 に答える
1
select t1.id,
    t1.name,
    t1.email,
    MAX(CASE WHEN t2.key='age' THEN t2.value ELSE NULL END) AS age,
    MAX(CASE WHEN t2.key='tele' THEN t2.value ELSE NULL END) AS tele
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.Id = t2.uid
GROUP BY t1.id, t1.name, t1.email
于 2012-12-13T17:40:20.143 に答える
1

このようなもの:

select 
  t.Id,
  t.Name, 
  t.Email,
  (select Value from Table2 t2 where t2.uid = t.Id and t2.Key = 'Age') as Age, 
  (select Value from Table2 t2 where t2.uid = t.Id and t2.Key = 'Tele') as Tele 

from Table1 t

上記のクエリは、キーが事前にわかっている場合に機能します。名前が不明な場合は、データベースから使用可能なキー名のリストを取得します。

select distinct Key from Table2
于 2012-12-13T17:40:31.683 に答える
1
select
  Id,
  Name,
  email,
  age.Value as age,
  tele.Value as tele
from `Table 1`
left join `Table 2` as age on age.key='Age' and age.uid=Id
left join `Table 2` as tele on tele.key='Tele' and tele.uid=Id
;

テーブル 2 を数回 (複数のテーブルであるかのように) 単純に結合し、そのたびに特定のキーに一致する値のみを取得しました。次に、関心のある値について、それぞれに適切なエイリアスを選択し、それに応じて列に名前を付けました。

于 2012-12-13T17:41:38.577 に答える