如何在MySQL中合并多行?

时间:2013-02-05 21:20:16

标签: mysql sql

我在构建数据库时遇到了一些问题,我会问两个问题。

第一个问题:下表需要用相同的ID合并

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ║  0  ║       ║ 11  ║       ║
 ║  0  ║       ║     ║   6   ║
 ║  1  ║ Dave  ║     ║       ║
 ║  1  ║       ║ 12  ║       ║
 ║  1  ║       ║     ║   7   ║
 ╚═════╩═══════╩═════╩═══════╝

所以看起来应该是这样的;

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║ 11  ║   6   ║
 ║  0  ║ Dave  ║ 12  ║   7   ║
 ╚═════╩═══════╩═════╩═══════╝

注意:id *不是AUTO_INCREMENT


第二个问题:您可能认为以前的数据库结构很差。好消息是,我还没有创建数据库,我一直在寻找一种解决方案,将数据添加到现有行而不删除旧信息,但如果没有旧信​​息,它将创建一个新行。提前谢谢。

第二个问题解释

维珍表

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║     ║       ║     ║       ║
 ╚═════╩═══════╩═════╩═══════╝

一些SQL语句

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ╚═════╩═══════╩═════╩═══════╝

具有不同参数的相同SQL语句

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ║  1  ║ Dave  ║     ║       ║
 ╚═════╩═══════╩═════╩═══════╝

另一个SQL语句

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ║  1  ║ Dave  ║ 12  ║       ║
 ╚═════╩═══════╩═════╩═══════╝

另一个SQL语句

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║   6   ║
 ║  1  ║ Dave  ║ 12  ║       ║
 ╚═════╩═══════╩═════╩═══════╝

......等等。

2 个答案:

答案 0 :(得分:14)

您应该能够将聚合函数应用于所有列,然后GROUP BY id

select id,
  max(name) name,
  max(age) age,
  max(grade) grade
from yourtable
group by id

请参阅SQL Fiddle with Demo

就数据库结构而言,我看到的唯一问题是您要为同一用户插入多条记录。您应该使用UPDATE语句来使用值而不是插入。

听起来你想在MySQL中使用REPLACE函数(here is a tutorial)。

所以查询类似于:

REPLACE 
  INTO yourtable (`id`, `name`, `age`, `grade`) 
  VALUES (0, 'john', 11, null);

请参阅SQL Fiddle with Demo

答案 1 :(得分:5)

您可以按id进行分组,并使用任何聚合函数来选择非空行。此示例使用max,但min也可以使用:

select  id
,       max(name) as name
,       max(age) as age
,       max(grade) as grade
from    YourTable
group by
        id