Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MYSQl中合并多个共有两列的表_Mysql_Sql - Fatal编程技术网

如何在MYSQl中合并多个共有两列的表

如何在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 我只希望合并所有表中年龄和性别相同的列。

我有四张桌子表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

我只希望合并所有表中年龄和性别相同的列。你知道怎么做吗?

可以通过以下方式轻松完成:

如果您要求所有表中的所有数据在列中具有相同的值,则可以将任何表与任何表连接起来


请注意,在实际生产脚本中不应使用
*
,请明确使用列名。

这可以通过以下方式轻松实现:

如果您要求所有表中的所有数据在列中具有相同的值,则可以将任何表与任何表连接起来


请注意,在实际生产脚本中不应使用
*
,应明确使用列名。

很可能无法通过纯匹配获得所需的结果。例如,以下内容将创建您描述的表:

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
体重
等行。