我需要排除 bidding_price
列中的重复记录,条件如下:
表:bid_account
要检查的列:
id
= PRIMARY KEY
auction_id
= ID of each product
bidding_price
= inserted value (this must be checked for duplicity for each product)
bid_flag
= must always equal the value of: 'd'
bidding_type
= must always equal the value of:: 's'
bidding_price
列中始终存在相同的记录,但不能存在具有相同产品 ID (auction_id
) 的相同记录。
不应该有的示例:
auction_id | bidding_price
------10------------0.02
------10------------0.02
------11------------0.02
------11------------0.02
正确的是:
auction_id | bidding_price
------10------------0.02
------11------------0.02
我尝试使用以下命令:
DELETE ba
FROM bid_account ba JOIN
(SELECT ba2.auction_id, ba2.bidding_price, MAX(ba2.id) as max_id
FROM bid_account ba2
WHERE ba2.bid_flag = 'd' AND ba2.bidding_type = 's'
GROUP BY ba2.auction_id, ba2.bidding_price
) ba2
ON ba2.auction_id = ba.auction_id AND
ba2.bidding_price = ba.bidding_price AND
ba2.max_id < ba.id
WHERE ba.bid_flag = 'd' AND ba.bidding_type = 's' AND ba.auction_id = ba2.auction_id
问题在于它删除了多条不应该删除的记录,没有正确进行验证。我该怎么做?
最佳答案
ID 是表中的主键,因此您可以将 MAX(id)
设为您的
预约ID,然后使用NOT IN
按ID删除,不带MAX(id)
你可以试试这个。
DELETE ba FROM bid_account ba
WHERE ba.id NOT IN
(
SELECT max_id FROM
(
SELECT auction_id, bidding_price, MAX(id) max_id
FROM bid_account
WHERE bid_flag = 'd' AND bidding_type = 's'
GROUP BY auction_id, bidding_price
) t
)
sqlfiddle:http://sqlfiddle.com/#!9/0f2e5/1
编辑
如果您想获取最低值的 ID,可以在 where 子句的子查询中使用 MIN(id)
DELETE ba FROM bid_account ba
WHERE ba.id NOT IN
(
SELECT min_id FROM
(
SELECT auction_id, bidding_price, MIN(id) min_id
FROM bid_account
WHERE bid_flag = 'd' AND bidding_type = 's'
GROUP BY auction_id, bidding_price
) t
)
sqlfiddle:http://sqlfiddle.com/#!9/ffe92/1
关于mysql - 删除多个条件的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49849132/