SQL - 删除每个用户ID组中除最高值之外的所有重复项

6

看起来我们的偏好表中可能有一些重复的值,因此我想删除每个用户的所有重复条目,但保留最近的一条。我已经花了很长时间试图想出一个解决方案,但我一直在打转。我尝试过max、group by、子查询等方法。删除最高的很容易,但不是除了最高的其他所有内容。特别是对于每个用户。

因此,在数据库中,我可能会有:

id  :   name:       value   :   userId
1   :   sortOrder:  Asc     :   1
2   :   sortOrder:  Desc    :   1
3   :   sortOrder:  Asc     :   2
4   :   something:  value2  :   1

在这种情况下,我希望删除第一行,因为它是用户1的重复行,并具有最高的ID,同时保留所有其它列。

所以我知道至少需要使用group by子查询,但我就是想不出来。到目前为止,我只有:

SELECT 
    MAX(id),
    name
FROM 
    preference
GROUP BY
    name

这个查询可以给我一个想要保留的列表,但是对于每个用户仍然会漏掉一些。所以如果我对于每个用户都有这个列表,我希望有相反的结果。不过,我觉得即便在子查询中使用<>也不可行。
我的最终目标是删除所有重复条目中ID较低的同一用户。

1
按userID分组,如果您想按用户进行分组。 - Scotch
1个回答

11

假设 Id 列是唯一的标识符,则有一种方法:

DELETE FROM preference
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId)

[注意:通常的建议也适用。在生产环境中运行前,不要忘记先测试]

首先进行测试:

SELECT * FROM preference
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId)

SQLFiddle在这里。功能正常,但建议使用更大的数据集进行测试...


在没有先使用SELECT操作试探一下的情况下进行DELETE操作只会自找麻烦 ;) - Stephane Grenier
1
这就是为什么我提到它的原因。 - Mitch Wheat
这就是我所缺少的NOT IN和第二个分组。不知道你可以在同一个select中进行第二个分组。谢谢 :) - Stephane Grenier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接