6

看起来我们的首选项表中可能有一些重复的值,所以我想删除每个用户的所有重复条目,但最近的一个。我花了很长时间试图想出一个解决方案,但我一直在转圈。我已经尝试过最大值、分组方式、子查询等。删除最高的很容易,但除了最高的以外,不是所有的。特别是对于每个用户

所以在数据库中我可能有:

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 的重复条目。

4

1 回答 1

11

一种方法,假设Idcolumn 是唯一的 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 在这里。按预期工作。我建议使用更大的数据集进行测试...

于 2013-04-27T02:06:48.250 回答