2014-12-21 72 views
0

我有2代表我需要從塔幾乎轉換的結果錶行轉換表列到行MySQL查詢

表1:master_table

master_id user_name 

    1   name1 

    2   name2 

    3   name3 

    4   name4 

表2:master_meta_table

id master_id  meta_key   meta_value 

    1 1    f_name   fname1 

    2 2    f_name   fname2 

    3 2    l_name   lname2 

    4 2    age    age2 

    5 3    l_name   lnam3 

    6 3    age    age3 

    7 4    sex    male 

我想獲得這樣的結果

master_id user_name  f_name  l_name age sex 

    1   name1   fname1       

    2   name2   fname2  lname2 age2       

    3   name3     lname3 age3      

    4   name4   fname4      male 

請有人幫我這個...

+0

請不要在這裏幫忙嗎? –

回答

2

嘗試:

select 
    mt1.master_id, 
    mt1.user_name, 
    max(case when mt2.meta_key = 'f_name' then mt2.meta_value end) as fname, 
    max(case when mt2.meta_key = 'l_name' then mt2.meta_value end) as lname, 
    max(case when mt2.meta_key = 'age' then mt2.meta_value end) as age, 
    max(case when mt2.meta_key = 'sex' then mt2.meta_value end) as sex 
from 
    master_table mt1 
join master_meta_table mt2 on mt1.master_id = mt2.master_id 
group by 
    mt1.master_id, 
    mt1.user_name 

小提琴:http://sqlfiddle.com/#!2/af277e/3/0

+0

謝謝先生,對於答覆 在表2中,也許有一些更多的元鍵,值域將被添加。我不知道將來會添加哪些元鍵。 那麼在那種情況下如何寫查詢? –

+1

這超出了純sql的範圍。將不得不看看動態SQL,雖然我認爲你會更好在Excel中做一個數據透視表 –

1

這是你的DDL

create table master_table 
(
    master_id int, 
    user_name varchar(20) 
); 

create table master_meta_table 
(
    id int, 
    master_id int, 
    meta_key varchar(20), 
    meta_value varchar(20) 
); 


insert into master_table 
values (
    1,'name1'); 
insert into master_table 
values (
    2,'name2'); 
insert into master_table 
values (
    3,'name3'); 
insert into master_table 
values (
    4,'name4'); 

insert into master_meta_table 
values (
    1,1,'f_name','fname1'); 
insert into master_meta_table 
values (
    2,2,'f_name','fname2'); 
insert into master_meta_table 
values (
    3,2,'l_name','lname2'); 
insert into master_meta_table 
values (
    4,2,'age','age2'); 
insert into master_meta_table 
values (
    5,3,'l_name','lname3'); 
insert into master_meta_table 
values (
    6,3,'age','age3'); 
insert into master_meta_table 
values (
    7,4,'sex','male'); 

查詢

select 
    mt.master_id, 
    mt.user_name, 
    max (case when mmt.meta_key = 'f_name' then mmt.meta_value end) as fname, 
    max (case when mmt.meta_key = 'l_name' then mmt.meta_value end) as lname, 
    max (case when mmt.meta_key = 'age' then mmt.meta_value end) as age, 
    max (case when mmt.meta_key = 'sex' then mmt.meta_value end) as sex 
from 
    master_table mt,master_meta_table mmt 
where mt.master_id = mmt.master_id 
group by mt.master_id,mt.user_name 

http://sqlfiddle.com/#!4/55845/8

+0

感謝您的答覆先生, –

+0

也許有時會有一些更多的元鍵,價值領域將被添加。我不知道將來會添加哪些元鍵。那麼在那種情況下如何寫查詢? –

+1

在這種情況下,我不確定如何重命名別名。我曾問過http://stackoverflow.com/questions/27540178/dynamic-column-alias-name,但沒有得到明確的答案。如果你可以命名別名,那麼你可以聯合另一個不同的查詢,這將導致只有列 – szakwani