Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从“MySQL”中删除重复项,并根据订单保留单个记录_Mysql - Fatal编程技术网

从“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