0

表 1 : User_Profile

-------------------------------------------------------------------------------------------
User_profile_id   | Profile_form_id |   Email       |   Zipcode   |   Firstname | Lastname
-------------------------------------------------------------------------------------------

1                 | 4               |john@gmail.com |  123456     |  john       | peter 
------------------------------------------------------------------------------------------

-

表 2 : Profile_attribute_form

-------------------------------------------------------------------
profile_attribute_id   | Profile_attribute_name |  profile_form_id 
-------------------------------------------------------------------

1                      | Address                |  4
-------------------------------------------------------------------
2                      | Phone Number           |  4
------------------------------------------------------------------
3                      | City                   |  4
-------------------------------------------------------------------

表 3 : User_Profile_attribute


User_profile_id        | Profile_attribute_id   |  profile_attribute_value 
--------------------------------------------------------------------------

1                      | 1                      |  23,Times road
--------------------------------------------------------------------------
1                      | 2                      |  9786530874
--------------------------------------------------------------------------
1                      | 3                      |  New York
--------------------------------------------------------------------------

必要な最終結果:

-------------------------------------------------------------------------------------------
User_profile_id|Profile_form_id|Email |Zipcode|Firstname|Lastname|Address|PhoneNumber|City
-------------------------------------------------------------------------------------------

1              |4              |gm.com|123456 |john     |peter   |addr1  |9786530874 |NewY 
-------------------------------------------------------------------------------------------

上記の結果の mysql クエリを作成する方法。

4

1 に答える 1

3

あなたがする必要があるのはJOIN、テーブルとPIVOTデータです。ただし、MySQL にはPIVOT関数がありませんが、集計関数とCASEステートメントを使用して機能を複製できます。

列に変換する値がわかっている場合は、次を使用できます。

select up.user_profile_id,
  up.profile_form_id,
  up.email,
  up.zipcode,
  up.firstname,
  up.lastname,
  min(case when paf.Profile_attribute_name= 'Address' 
            then upa.profile_attribute_value end) as Address,
  min(case when paf.Profile_attribute_name= 'Phone Number' 
            then upa.profile_attribute_value end) as PhoneNumber,
  min(case when paf.Profile_attribute_name= 'City' 
            then upa.profile_attribute_value end) as City
from user_profile up
left join Profile_attribute_form paf
  on up.Profile_form_id = paf.Profile_form_id
left join User_Profile_attribute upa
  on paf.profile_attribute_id = upa.Profile_attribute_id
  and up.User_profile_id = upa.User_profile_id
group by up.user_profile_id,
      up.profile_form_id,
      up.email,
      up.zipcode,
      up.firstname,
      up.lastname

SQL Fiddle with Demoを参照してください

これを動的に実行する場合、つまり転置する列が事前にわからない場合は、次の記事を確認する必要があります。

動的ピボット テーブル (行を列に変換)

コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'min(case when paf.Profile_attribute_name = ''',
      paf.Profile_attribute_name,
      ''' then upa.profile_attribute_value end)  AS ',
      replace(paf.Profile_attribute_name, ' ', '')
    )
  ) INTO @sql
from user_profile up
left join Profile_attribute_form paf
  on up.Profile_form_id = paf.Profile_form_id;

SET @sql 
  = CONCAT('select up.user_profile_id,
              up.profile_form_id,
              up.email,
              up.zipcode,
              up.firstname,
              up.lastname, ', @sql, '
           from user_profile up
           left join Profile_attribute_form paf
             on up.Profile_form_id = paf.Profile_form_id
           left join User_Profile_attribute upa
             on paf.profile_attribute_id = upa.Profile_attribute_id
             and up.User_profile_id = upa.User_profile_id
           group by up.user_profile_id,
                 up.profile_form_id,
                 up.email,
                 up.zipcode,
                 up.firstname,
                 up.lastname');

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

SQL Fiddle with Demoを参照してください

于 2012-09-14T10:39:19.930 に答える