我想根据多个条件合并行,基本上删除重复项,我可以定义“重复”的含义。这是一个示例表:
╔═════╦═══════╦═════╦═══════╗
║ id* ║ name ║ age ║ grade ║
╠═════╬═══════╬═════╬═══════╣
║ 1 ║ John ║ 11 ║ 5 ║
║ 2 ║ John ║ 11 ║ 5 ║
║ 3 ║ John ║ 11 ║ 6 ║
║ 4 ║ Sam ║ 14 ║ 7 ║
║ 5 ║ Sam ║ 14 ║ 7 ║
╚═════╩═══════╩═════╩═══════╝
在我的示例中,假设我要在name
和age
上合并,但忽略grade
。结果应该是:
╔═════╦═══════╦═════╦═══════╗
║ id* ║ name ║ age ║ grade ║
╠═════╬═══════╬═════╬═══════╣
║ 1 ║ John ║ 11 ║ 5 ║
║ 3 ║ John ║ 11 ║ 6 ║
║ 4 ║ Sam ║ 14 ║ 7 ║
╚═════╩═══════╩═════╩═══════╝
我并不特别在意id
列是否已更新为增量,但我认为这样会很好。
我可以在MySQL中这样做吗?
答案 0 :(得分:1)
我的建议,基于我的上述评论。
SELECT distinct name, age, grade
into tempTable
from theTable
这将忽略ID,并且只为您提供一个不同的转储,并且只为新表提供。
然后你可以删除旧的,然后重命名新的。或截断旧的,然后将其转储回来。
答案 1 :(得分:1)
您可以像这样删除重复项:
delete test
from test
inner join (
select name, age, grade, min(id) as minid, count(*)
from test
group by name, age, grade
having count(*) > 1
) main on test.id = main.minid;