如何在MYSQl中合并多个共有两列的表
我有四张桌子表1,表2,表3和表4。所有四个都有如下列:如何在MYSQl中合并多个共有两列的表,mysql,sql,Mysql,Sql,我有四张桌子表1,表2,表3和表4。所有四个都有如下列: table_1: age_grp, gender, height; table_2: age_grp, gender, weight; table_3: age_grp, gender, shoesize; table_4: age_group, gender, BMI; 我想创建一个包含列的新表: age_grp, gender, height, weight, shoesize, BMI 我只希望合并所有表中年龄和性别相同的列。
table_1: age_grp, gender, height;
table_2: age_grp, gender, weight;
table_3: age_grp, gender, shoesize;
table_4: age_group, gender, BMI;
我想创建一个包含列的新表:
age_grp, gender, height, weight, shoesize, BMI
我只希望合并所有表中年龄和性别相同的列。你知道怎么做吗?可以通过以下方式轻松完成: 如果您要求所有表中的所有数据在列中具有相同的值,则可以将任何表与任何表连接起来
请注意,在实际生产脚本中不应使用
*
,请明确使用列名。这可以通过以下方式轻松实现:
如果您要求所有表中的所有数据在列中具有相同的值,则可以将任何表与任何表连接起来
请注意,在实际生产脚本中不应使用
*
,应明确使用列名。很可能无法通过纯匹配获得所需的结果。例如,以下内容将创建您描述的表:
insert into newtable
select t1.age_grp, t1.gender, t1.height, t2.weight, t3.shoesize, t4.BMI
from table_1 t1
inner join table_2 t2 on t1.age_grp = t2.age_grp
and t1.gender = t2.gender
inner join table_3 t3 on t1.age_grp = t3.age_grp
and t1.gender = t3.gender
inner join table_4 t4 on t1.age_grp = t4.age_grp
and t1.gender = t4.gender;
问题是,如果其中任何一项失败,就不会得到一行。你可以考虑使用外部连接。 < P>有一个很好的机会,你不会得到一个纯粹的匹配你想要的结果。例如,以下内容将创建您描述的表:
insert into newtable
select t1.age_grp, t1.gender, t1.height, t2.weight, t3.shoesize, t4.BMI
from table_1 t1
inner join table_2 t2 on t1.age_grp = t2.age_grp
and t1.gender = t2.gender
inner join table_3 t3 on t1.age_grp = t3.age_grp
and t1.gender = t3.gender
inner join table_4 t4 on t1.age_grp = t4.age_grp
and t1.gender = t4.gender;
create table mytable as
select age_grp, gender, max(height) as height, max(weight) as weight, max(shoesize) as shoesize, max(bmi) as bmi
from
(
select age_grp, gender, height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_1
union all
select age_grp, gender, cast(null as unsigned integer) as height, weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_2
union all
select age_grp, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, shoesize, cast(null as unsigned integer) as bmi from table_3
union all
select age_group, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, bmi from table_4
) x
group by age_grp, gender;
问题是,如果其中任何一项失败,就不会得到一行。你可以考虑使用外部连接。尽管这个请求已经被回答了,但是我想给丢失的值的情况添加一个答案,例如,对于一个AGEGEGRP/性别对,只有SueSeIe。
create table mytable as
select age_grp, gender, max(height) as height, max(weight) as weight, max(shoesize) as shoesize, max(bmi) as bmi
from
(
select age_grp, gender, height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_1
union all
select age_grp, gender, cast(null as unsigned integer) as height, weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_2
union all
select age_grp, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, shoesize, cast(null as unsigned integer) as bmi from table_3
union all
select age_group, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, bmi from table_4
) x
group by age_grp, gender;
对于具有连接的解决方案,您需要MySQL不支持的完整外部连接。用左外联接和/或右外联接来模拟这一点对于几个表来说可能是一件痛苦的事情
这里是一个使用联合调用和最终聚合的解决方案
create table mytable as
select age_grp, gender, max(height) as height, max(weight) as weight, max(shoesize) as shoesize, max(bmi) as bmi
from
(
select age_grp, gender, height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_1
union all
select age_grp, gender, cast(null as unsigned integer) as height, weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_2
union all
select age_grp, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, shoesize, cast(null as unsigned integer) as bmi from table_3
union all
select age_group, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, bmi from table_4
) x
group by age_grp, gender;
我很惊讶CAST(NULL为INT)
会导致语法错误,顺便说一句。我不得不将其更改为CAST(NULL为无符号整数)
SQL fiddle:。尽管此请求已经得到了回答,但我想为缺少值的情况添加一个答案,例如,对于年龄/性别对,仅给出鞋码 对于具有连接的解决方案,您需要MySQL不支持的完整外部连接。用左外联接和/或右外联接来模拟这一点对于几个表来说可能是一件痛苦的事情 这里是一个使用联合调用和最终聚合的解决方案
create table mytable as
select age_grp, gender, max(height) as height, max(weight) as weight, max(shoesize) as shoesize, max(bmi) as bmi
from
(
select age_grp, gender, height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_1
union all
select age_grp, gender, cast(null as unsigned integer) as height, weight, cast(null as unsigned integer) as shoesize, cast(null as unsigned integer) as bmi from table_2
union all
select age_grp, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, shoesize, cast(null as unsigned integer) as bmi from table_3
union all
select age_group, gender, cast(null as unsigned integer) as height, cast(null as unsigned integer) as weight, cast(null as unsigned integer) as shoesize, bmi from table_4
) x
group by age_grp, gender;
我很惊讶CAST(NULL为INT)
会导致语法错误,顺便说一句。我不得不将其更改为CAST(NULL为无符号整数)
SQL FIDLE:。对于第三个和第四个,我可以在逗号后添加名称吗?@VMAtm我有类似的查询,想优化LINQquery@ArijitMukherjee在使用LINQ时,您应该提出不同的问题。但是,
JOIN
s无法轻松优化。@VMAtm无法将此对话带到聊天室?@VMAtm非常感谢。请不要介意我问这个问题,但我只有一个小问题。现在我不希望年龄和性别重复出现。我的意思是现在新的部分有像age\u grp
gender
height
age\u grp
gender
weight
等行。对于第三行和第四行,我可以在逗号后添加名称吗?@VMAtm我有类似的查询,想要优化LINQquery@ArijitMukherjee在使用LINQ时,您应该提出不同的问题。但是,JOIN
s无法轻松优化。@VMAtm无法将此对话带到聊天室?@VMAtm非常感谢。请不要介意我问这个问题,但我只有一个小问题。现在我不希望年龄和性别重复出现。我的意思是现在新的部分有像age\u grp
gender
height
age\u grp
gender
体重
等行。