2014-12-21 65 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