我需要刪除所有重複項並保留最高金額的項。也許我應該做一些JOIN操作,但我不是很有經驗。我有這個疑問:刪除`MySQL`中的重複項並根據訂單保留單個記錄
SELECT *
FROM invoices
GROUP BY user
ORDER BY amount DESC
它查詢所有行,按金額預定他們和「刪除」的重複它按用戶,但顯然並不刪除重複。任何幫助表示讚賞。要清楚地說明重複項必須永久刪除。 架構:
user varchar(125), amount int
我需要刪除所有重複項並保留最高金額的項。也許我應該做一些JOIN操作,但我不是很有經驗。我有這個疑問:刪除`MySQL`中的重複項並根據訂單保留單個記錄
SELECT *
FROM invoices
GROUP BY user
ORDER BY amount DESC
它查詢所有行,按金額預定他們和「刪除」的重複它按用戶,但顯然並不刪除重複。任何幫助表示讚賞。要清楚地說明重複項必須永久刪除。 架構:
user varchar(125), amount int
如果你做了SELECT *
這不會過濾掉的記錄,即使有GROUP BY
。
SELECT user, MAX(amount) amount
FROM invoices
GROUP BY user
ORDER BY amount DESC
請注意,由於您使用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;
我想知道爲什麼你需要有額外的表來存儲每個用戶的最大記錄。你的原始答案很好,只需要使用'RIGHT JOIN'並找到空值。 – 2013-02-28 02:44:47
@JW。出於某種原因,這個想法經歷了我的想法,即OP在執行查詢時可能不會謹慎。 – Kermit 2013-02-28 02:45:26
抱歉,我的意思是'LEFT JOIN'。 http://sqlfiddle.com/#!2/ce2f8/1 – 2013-02-28 02:50:04
如果你想用的最高金額的行,試試這個:
select *
from invoices
order by amount desc
limit 1
我不知道你所說的「是什麼意思刪除」。你真的想刪除所有的行,但最高的金額嗎?
我認爲有人正在使用這個問題來解決人們的問題 – 2013-02-28 02:31:00
@MattBusche。 。 。你總是可以刪除你的答案,以獲得回分。原來的問題似乎是合法的。很難像這樣屠殺英語。我發現不同的解釋很有趣。沒有一個答案似乎值得讚賞。 – 2013-02-28 02:33:25
我並不擔心代表,但我同意我們的答案都不值得讚揚。還有一個答案已經被刪除了,而且被取消了。 – 2013-02-28 02:34:37
對於剛剛找到重複的緣故,你可以嘗試:
SELECT id, COUNT(amount) AS cnt, MAX(amount) AS mx
FROM invoices
GROUP BY user HAVING cnt > 1
ORDER BY amount DESC
從那裏,你可以繼續刪除這些記錄。
你能顯示樣本記錄嗎?你的桌子的模式是什麼?刪除你的意思是刪除結果上沒有顯示的表格? – 2013-02-28 02:22:09
你真的想刪除記錄嗎?或者只是從查詢中刪除重複項? – 2013-02-28 02:26:25
你的問題是不完整的。 – 2013-02-28 02:32:47