如何在MySQL中合并多行?

Ber*_*lcı 6 mysql sql

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

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

 ?????????????????????????????
 ? id* ? name  ? age ? grade ?
 ?????????????????????????????
 ?  0  ? John  ?     ?       ?
 ?  0  ?       ? 11  ?       ?
 ?  0  ?       ?     ?   6   ?
 ?  1  ? Dave  ?     ?       ?
 ?  1  ?       ? 12  ?       ?
 ?  1  ?       ?     ?   7   ?
 ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

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

 ?????????????????????????????
 ? id* ? name  ? age ? grade ?
 ?????????????????????????????
 ?  0  ? John  ? 11  ?   6   ?
 ?  0  ? Dave  ? 12  ?   7   ?
 ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

注意:id*不是AUTO_INCREMENT


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

第二个问题解释

处女表

 ?????????????????????????????
 ? id* ? name  ? age ? grade ?
 ?????????????????????????????
 ?     ?       ?     ?       ?
 ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

一些SQL语句

 ?????????????????????????????
 ? id* ? name  ? age ? grade ?
 ?????????????????????????????
 ?  0  ? John  ?     ?       ?
 ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

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

 ?????????????????????????????
 ? id* ? name  ? age ? grade ?
 ?????????????????????????????
 ?  0  ? John  ?     ?       ?
 ?  1  ? Dave  ?     ?       ?
 ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

另一个SQL语句

 ?????????????????????????????
 ? id* ? name  ? age ? grade ?
 ?????????????????????????????
 ?  0  ? John  ?     ?       ?
 ?  1  ? Dave  ? 12  ?       ?
 ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

另一个SQL语句

 ?????????????????????????????
 ? id* ? name  ? age ? grade ?
 ?????????????????????????????
 ?  0  ? John  ?     ?   6   ?
 ?  1  ? Dave  ? 12  ?       ?
 ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

... 等等.

Tar*_*ryn 15

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

select id,
  max(name) name,
  max(age) age,
  max(grade) grade
from yourtable
group by id
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

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

听起来你想REPLACE在MySQL中使用这个功能(这是一个教程).

所以查询将类似于:

REPLACE 
  INTO yourtable (`id`, `name`, `age`, `grade`) 
  VALUES (0, 'john', 11, null);
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

  • Downvoter关心解释?说真的,我得到了DV,但另一个答案没有 (2认同)

And*_*mar 5

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

select  id
,       max(name) as name
,       max(age) as age
,       max(grade) as grade
from    YourTable
group by
        id
Run Code Online (Sandbox Code Playgroud)