0

私はこれを理解することはできません。

私はこのテーブルを持っています:

id    component_id     data
1     1                tests@dsaasd.com
1     2                firstname1
1     3                lastname1
1     4                phone1
2     1                email2
2     2                firstname2
2     3                lastname2
2     4                phone2

ここで、ID に従ってすべてのデータを抽出するクエリが必要です。これらのレコードが必要です:

1  tests@dsaasd.com  firstname1  lastname1  phone1
2  email2  firstname2  lastname2  phone2

私が理解されていることを願っています....

4

1 に答える 1

2

あなたが求めているのは基本的にですがPIVOT、MySQLにはピボット関数がないためCASE、集計関数を含むステートメントを使用してこれを複製できます.

値がわかっている場合は、次のようなソリューションをハードコーディングできます。

select id,
  max(case when component_id = 1 then data end) Email,
  max(case when component_id = 2 then data end) Firstname,
  max(case when component_id = 3 then data end) Lastname,
  max(case when component_id = 4 then data end) Phone
from yourtable
group by id;

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

結果は次のとおりです。

| ID |            EMAIL |  FIRSTNAME |  LASTNAME |  PHONE |
-----------------------------------------------------------
|  1 | tests@dsaasd.com | firstname1 | lastname1 | phone1 |
|  2 |           email2 | firstname2 | lastname2 | phone2 |

component_id を名前に関連付けるテーブルがあると推測しているので、クエリも次のようになります。

select t1.id,
  max(case when t2.name = 'email' then data end) Email,
  max(case when t2.name= 'FirstName' then data end) Firstname,
  max(case when t2.name= 'LastName' then data end) Lastname,
  max(case when t2.name= 'phone' then data end) Phone
from yourtable t1
inner join component t2
  on t1.component_id = t2.id 
group by t1.id;

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

値の数が不明な場合は、準備済みステートメントを使用してこのクエリを動的に生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when name = ''',
      name,
      ''' then data end) AS ',
      name
    )
  ) INTO @sql
FROM component;

SET @sql = CONCAT('SELECT t1.id, ', @sql, ' 
                  from yourtable t1
                  inner join component t2
                    on t1.component_id = t2.id 
                  group by t1.id');

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

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

すべてのバージョンで同じ結果が得られます。

于 2012-12-05T15:34:14.990 に答える