从“MySQL”中删除重复项,并根据订单保留单个记录
我需要删除所有的副本,只保留数量最高的一个。也许我应该做一些联合行动,但我对这方面不是很有经验。我有一个疑问:从“MySQL”中删除重复项,并根据订单保留单个记录,mysql,Mysql,我需要删除所有的副本,只保留数量最高的一个。也许我应该做一些联合行动,但我对这方面不是很有经验。我有一个疑问: SELECT * FROM invoices GROUP BY user ORDER BY amount DESC 它查询所有行,按数量排序,并在按用户分组时“删除”重复项,但显然不会删除重复项。感谢您的帮助。为了清楚起见,必须永久删除重复项。 模式: user varchar(125), amount int 如果执行选择*,即使使用分组依据,也不会过滤出记录 SEL
SELECT *
FROM invoices
GROUP BY user
ORDER BY amount DESC
它查询所有行,按数量排序,并在按用户分组时“删除”重复项,但显然不会删除重复项。感谢您的帮助。为了清楚起见,必须永久删除重复项。
模式:
user varchar(125), amount int
如果执行
选择*
,即使使用分组依据
,也不会过滤出记录
SELECT user, MAX(amount) amount
FROM invoices
GROUP BY user
ORDER BY amount DESC
请注意,由于使用
groupby
的方式,您将无法获得所需的结果。MySQL。您希望始终指定在组中选择的列:
SELECT col1, col2, AGGREGATE(col3)
FROM table
GROUP BY col1, col2
我需要选择所有行以查找重复项
要查找每个用户的最大金额
:
SELECT user,
Max(amount) AS amount
FROM invoices
GROUP BY user
并仅保留金额最高的行
选项1
使用左连接(谢谢JW):
选项2
创建临时表:
CREATE TABLE invoices (
user int,
amount decimal(5,2));
INSERT INTO invoices VALUES
(1, 100.00),
(1, 200.00),
(1, 300.00);
CREATE TABLE invoicesStg (
user int,
amount decimal(5,2));
INSERT INTO invoicesStg
(SELECT user, MAX(amount) AS amount
FROM invoices
GROUP BY user);
TRUNCATE invoices;
INSERT INTO invoices
SELECT user, amount
FROM invoicesStg;
DROP TABLE invoicesStg;
如果您想要金额最高的行,请尝试以下操作:
select *
from invoices
order by amount desc
limit 1
我不知道你说的“删除”是什么意思。是否确实要删除除数量最高的行以外的所有行?为了只查找重复行,您可以尝试:
SELECT id, COUNT(amount) AS cnt, MAX(amount) AS mx
FROM invoices
GROUP BY user HAVING cnt > 1
ORDER BY amount DESC
从那里,您可以继续删除这些记录 你能出示样品记录吗?您的表的模式是什么?“删除”是指在结果上未显示的表上删除?您是否确实要删除记录?或者只是从查询中删除重复项?您的问题不完整。我需要删除重复项,而不是从查询中删除它们。我认为很明显,当我使用GROUP BY时,它们被从查询中删除了。我认为有人在利用这个问题来捣乱people@MattBusche . . . 你可以随时删除你的答案以获得分数。原来的问题似乎是正确的。很难像那样糟蹋英语。我觉得不同的解释很有趣;没有一个答案值得投反对票。我不担心代表,但我同意我们的答案都不值得投反对票。还有一个已经被删除的答案被否决了。@MattBusche这个问题(对我来说)是不完整的,因此会产生太多的解释。向下的选民只想到他自己对问题的翻译。@MattBusche删除的答案建议完全删除记录;这并不能回答这个问题;OP想删除非MAX
记录。@AarolamaBluenk他真的想删除它们吗?他的SQL显示SELECT语句<代码>仅保留金额最高的行
转换为仅返回SELECT语句中的行,而不是delete语句中的行。最多也不清楚。问题的标题包含根据订单保存单个记录;对我来说,这意味着删除所有内容,但是。他说单个记录
,但你认为记录
根据他提供的内容,这完全是主观的,不清楚的。@AarolamaBluenk它将删除重复项。。。我想知道为什么需要额外的表来存储每个用户的max记录。您的原始答案很好,只是您需要使用右键联接
并查找空值。@JW。出于某种原因,我一直认为OP在执行查询时可能不会谨慎使用。RJ
删除了OP不使用的最大金额值;我不想要。@JW。他的问题不是说他想要最大的数量吗?那么从用户n1中删除n1,用户n2,其中n1.amountSELECT id, COUNT(amount) AS cnt, MAX(amount) AS mx
FROM invoices
GROUP BY user HAVING cnt > 1
ORDER BY amount DESC