8

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

第一个问题:下表需要通过相同的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  ║       ║
 ╚═════╩═══════╩═════╩═══════╝

... 等等。

4

2 回答 2

17

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

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

请参阅带有演示的 SQL Fiddle

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

听起来您想REPLACE在 MySQL 中使用该函数(这是一个教程)。

所以查询将与此类似:

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

请参阅带有演示的 SQL Fiddle

于 2013-02-05T21:22:31.547 回答
5

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

select  id
,       max(name) as name
,       max(age) as age
,       max(grade) as grade
from    YourTable
group by
        id
于 2013-02-05T21:21:42.150 回答