近期面试的时候,考官出了一道题,当时没有做出来。第二天灵光乍现吧,写出来了,特此记录一下。

有一张表t,三个字段,自增id,name,update_time,删除name重复的行,保留update_time最大的那一条,只保留一条

DELETE
FROM
	t
WHERE
	t.`name` IN (
		SELECT
			t.`name`
		FROM
			(SELECT * FROM t) t
		GROUP BY
			t.`name`
		HAVING
			count(1) > 1
	)
AND t.id NOT IN (
	SELECT
		substring_index(max(t.new_u_time), ',', - 1)
	FROM
		(
			SELECT
				t.id,
				t.`name`,
				t.update_time,
				CONCAT(t.update_time, ',', t.id) new_u_time
			FROM
				t
		) t
	GROUP BY
		t.`name`
	HAVING
		count(1) > 1
)




说明:如果是随便删除,保留一行,那大家应该都会,这里就是可能会出现update_time重复的情况,所以需要update_time和id concat 起来,然后取最大值,这样就不会重复了

相关文章:

  • 2021-05-31
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-09
  • 2021-11-01
  • 2021-08-18
相关资源
相似解决方案