我在构建数据库时遇到了一些问题,我会问两个问题。
第一个问题:下表需要用相同的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 ║ ║
╚═════╩═══════╩═════╩═══════╝
......等等。
答案 0 :(得分:14)
您应该能够将聚合函数应用于所有列,然后GROUP BY id
:
select id,
max(name) name,
max(age) age,
max(grade) grade
from yourtable
group by id
就数据库结构而言,我看到的唯一问题是您要为同一用户插入多条记录。您应该使用UPDATE
语句来使用值而不是插入。
听起来你想在MySQL中使用REPLACE
函数(here is a tutorial)。
所以查询类似于:
REPLACE
INTO yourtable (`id`, `name`, `age`, `grade`)
VALUES (0, 'john', 11, null);
答案 1 :(得分:5)
您可以按id
进行分组,并使用任何聚合函数来选择非空行。此示例使用max
,但min
也可以使用:
select id
, max(name) as name
, max(age) as age
, max(grade) as grade
from YourTable
group by
id