2013-02-28 83 views
-3

我需要刪除所有重複項並保留最高金額的項。也許我應該做一些JOIN操作,但我不是很有經驗。我有這個疑問:刪除`MySQL`中的重複項並根據訂單保留單個記錄

SELECT * 
FROM invoices 
GROUP BY user 
ORDER BY amount DESC 

它查詢所有行,按金額預定他們和「刪除」的重複它按用戶,但顯然並不刪除重複。任何幫助表示讚賞。要清楚地說明重複項必須永久刪除。 架構:

user varchar(125), amount int 
+0

你能顯示樣本記錄嗎?你的桌子的模式是什麼?刪除你的意思是刪除結果上沒有顯示的表格? – 2013-02-28 02:22:09

+0

你真的想刪除記錄嗎?或者只是從查詢中刪除重複項? – 2013-02-28 02:26:25

+0

你的問題是不完整的。 – 2013-02-28 02:32:47

回答

2

如果你做了SELECT *這不會過濾掉的記錄,即使有GROUP BY

SELECT user, MAX(amount) amount 
FROM invoices 
GROUP BY user 
ORDER BY amount DESC 
+0

這並不回答這個問題; OP想要刪除非'MAX'記錄。 – Kermit 2013-02-28 02:40:36

+0

@AarolamaBluenk他確實想刪除它們嗎?他的SQL顯示一個SELECT語句。 「只保留最高金額的行」轉換爲只返回SELECT語句中的那些,而不是刪除。目前還不清楚。 – 2013-02-28 02:41:43

+0

問題標題包含**根據訂單保留單個記錄**;對我來說這意味着除去一切。 – Kermit 2013-02-28 02:44:03

1

請注意,由於您使用GROUP BY的方式,您無法獲得理想的結果。 MySQL extends it's functionality。要始終指定在GROUP BY被選中的列:

SELECT col1, col2, AGGREGATE(col3) 
FROM table 
GROUP BY col1, col2 

我需要選擇所有行找到重複

要找到MAX量爲每user

SELECT user, 
     Max(amount) AS amount 
FROM invoices 
GROUP BY user 

,並保持最高金額僅排

選項1

使用LEFT JOIN(感謝JW):

DELETE invoices 
FROM  invoices 
LEFT JOIN 
    (SELECT user, MAX(amount) AS amount 
    FROM invoices 
    GROUP BY user) j 
      ON j.user = invoices.user 
       AND j.amount = invoices.amount 
WHERE j.amount IS NULL 

http://sqlfiddle.com/#!2/ce2f8/1

選項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; 

http://sqlfiddle.com/#!2/0381e/1

+0

我想知道爲什麼你需要有額外的表來存儲每個用戶的最大記錄。你的原始答案很好,只需要使用'RIGHT JOIN'並找到空值。 – 2013-02-28 02:44:47

+0

@JW。出於某種原因,這個想法經歷了我的想法,即OP在執行查詢時可能不會謹慎。 – Kermit 2013-02-28 02:45:26

+0

抱歉,我的意思是'LEFT JOIN'。 http://sqlfiddle.com/#!2/ce2f8/1 – 2013-02-28 02:50:04

0

如果你想用的最高金額的行,試試這個:

select * 
from invoices 
order by amount desc 
limit 1 

我不知道你所說的「是什麼意思刪除」。你真的想刪除所有的行,但最高的金額嗎?

+0

我認爲有人正在使用這個問題來解決人們的問題 – 2013-02-28 02:31:00

+0

@MattBusche。 。 。你總是可以刪除你的答案,以獲得回分。原來的問題似乎是合法的。很難像這樣屠殺英語。我發現不同的解釋很有趣。沒有一個答案似乎值得讚賞。 – 2013-02-28 02:33:25

+0

我並不擔心代表,但我同意我們的答案都不值得讚揚。還有一個答案已經被刪除了,而且被取消了。 – 2013-02-28 02:34:37

1

對於剛剛找到重複的緣故,你可以嘗試:

SELECT id, COUNT(amount) AS cnt, MAX(amount) AS mx 
FROM invoices 
GROUP BY user HAVING cnt > 1 
ORDER BY amount DESC 

從那裏,你可以繼續刪除這些記錄。

+0

僅供參考,您在此處錯誤地使用了「GROUP BY」。 – Kermit 2013-02-28 02:44:29

+0

我不這麼認爲。 GROUP BY位於聚合函數之前,因此您可以在打印出可能有多少重複項之前將用戶分組。 – foxns7 2013-02-28 02:50:47

+0

@TakenByForce您正在按用戶分組,但在您的選擇語句中由用戶計數。這是行不通的。 – 2013-02-28 02:57:44

相關問題