Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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_Union - Fatal编程技术网

Mysql 如何仅从多个表中合并一列?

Mysql 如何仅从多个表中合并一列?,mysql,sql,union,Mysql,Sql,Union,我发现很难提出这个问题,所以我将展示我正在努力做的事情 Table1 (ID, Name, Score) 1 Jane 10 2 Jack 15 3 Jill 12 4 Jane 10 Table2 (ID, Name, Score) 1 John 11 2 Jill 14 3 Jack 16 4 Jake 15 我想要的结果是 Result (Name, Table1.Score, Table2.Score) Jane 20

我发现很难提出这个问题,所以我将展示我正在努力做的事情

Table1 (ID, Name, Score)  
1 Jane  10  
2 Jack  15  
3 Jill  12  
4 Jane  10  


Table2 (ID, Name, Score)  
1 John  11  
2 Jill  14  
3 Jack  16  
4 Jake  15  
我想要的结果是

Result (Name, Table1.Score, Table2.Score)  
Jane 20   NULL
Jack 15   16
Jill 12   14
John NULL 11
Jake NULL 15

名称可以成为主键吗?请注意,Jane在表1中出现了两次(也可能出现在表2中),我希望将分数相加,并使名称在给定的表中唯一

这里有一种使用
UNION
SUM
的方法:

SELECT T.Name, Sum(T.Score), Sum(T2.Score) Score2
FROM (SELECT Name, SUM(Score) score FROM Table1 GROUP BY Name)  t
  LEFT JOIN (SELECT Name, SUM(Score) score FROM Table2  GROUP BY Name) t2
ON t.Name = t2.Name
GROUP BY T.Name
UNION   
SELECT T.Name, Sum(T2.Score), Sum(T.Score) Score2
FROM (SELECT Name, SUM(Score) score FROM Table2 GROUP BY Name)  t
  LEFT JOIN (SELECT Name, SUM(Score) score FROM Table1  GROUP BY Name) t2
ON t.Name = t2.Name
GROUP BY T.Name
这是我的答案


祝你好运。

好吧,如果MySQL有
完整的外部连接,你会使用它。以下是另一种方法:

select id, name, MAX(score1) as score1, MAX(score2) as score2
from ((select  id, name, score as score1, NULL as score2
       from table1
      ) union all
      (select  id, name, null as score1, score as score2
       from table1
      )
     ) t
group by id, name
其思想是通过使用
union-all
并将分数拆分为两个单独的列,从每个表中获取所需的所有信息,分数在不同的列中

最后的
分组依据
将它们与每个id的一行放在一起。

试试这个

 select  t1.name , sum(t1.score) as score1 ,sum(t2.score2) as score2 from Table1 as t1
 left JOIN 
 (select  name , score as score2 from Table2 )t2 
 on t1.name = t2.name 
 group by name

 union all

 select  t2.name , sum(t1.score1) as score1, sum(t2.score) as score2  from Table2 as t2
 left JOIN 
 (select  name , score as score1 from Table1 )t1 
 on t2.name = t1.name 
 where score1 is  null

 group by name
 ---- if you want use the order add this "order by name" here in the end
这将输出:

  NAME |    SCORE1  |SCORE2
  Jack |     15     | 16
  Jane |     20     |(null)
  Jill |     12     | 14
  Jake |    (null)  | 15
  John |    (null)  | 11
试试这个:

select 
name = Table1.name, 
sum(Table1.score) as score1,
sum(Table2.Score) as score2
from Table1
full outer join
Table2 
ON 
Table2.name = Table1.name
where Table1.name is not null
group by table1.name

UNION

select 
name = Table2.name, 
sum(Table1.score) as score1,
sum(Table2.Score) as score2
from Table1
full outer join
Table2 
ON 
Table2.name = Table1.name
where Table2.name is not null
group by table2.name

order by score1 desc, score2

如果你让名字独一无二,你会怎么对待同名的人呢?这不是我的数据库,设计也很糟糕,所以我添加了一个“用户”表来列出所有的名字。但是,如果有两个相同的名称,他们必须使用数字/首字母使其唯一。我有30多个表,如果没有名称表来解决这个问题,那将是一场灾难。