假设我想先选择download_link相同的行。然后,我想保留那个具有最低主要ID的那个,然后扔掉其余的。
是否有一个简单的SQL语句?这会有用吗?
delete from mytable
where id not in
(select min(id)
from mytable
group by download_link);
答案 0 :(得分:4)
这样的事情应该有效:
DELETE FROM `table`
WHERE `id` NOT IN (
SELECT MIN(`id`)
FROM `table`
GROUP BY `download_link`)
为了安全起见,在运行实际删除查询之前,您可能需要执行等效选择以查看删除的内容:
SELECT * FROM `table`
WHERE `id` NOT IN (
SELECT MIN(`id`)
FROM `table`
GROUP BY `download_link`)
答案 1 :(得分:2)
您不需要临时表或子查询。您可以通过简单的连接来完成:
DELETE t0
FROM mytable AS t0
JOIN mytable AS t1 ON t1.download_link=t0.download_link AND t1.id<t0.id;
即,“删除具有相同链接和较低ID的另一行的每一行”。
答案 2 :(得分:1)
错误1093会阻止您的方法在MySQL中运行。通过创建临时表来解决此问题:
CREATE TEMPORARY TABLE table_purge SELECT MIN(id) id FROM table GROUP BY download_link;
DELETE FROM table where id NOT IN (SELECT id FROM table_purge);
编辑以添加不涉及显式临时表的替代解决方法。可能这是有效的,因为查询执行计划自然会创建一个临时表:
DELETE table
FROM table
NATURAL JOIN (
SELECT id, download_link
FROM table
NATURAL JOIN (
SELECT MIN(id) min_id, download_link
FROM table
GROUP BY download_link ) table_min
WHERE id > min_id
) table_to_purge;
答案 3 :(得分:0)
尝试以下查询
delete from table where id not in
(select * from
(select min(id) from table group by download_link)
SWA_TABAL)
它适用于mysql 5.0.x