mysql - 删除多个条件的记录

标签 mysql sql

我需要排除 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/

相关文章:

mysql - 尝试更新与同一个表中的多个其他行相关的表

MYSQL使用JOIN表进行查询

mysql - 在 MySQL 中按 DATE 分组 DATETIME 并显示当天的最后一条记录

Mysql 函数 CONTAINS 和 GEOMFROMTEXT 不起作用

sql - 甲骨文 SQL : Previous MAX sore in all previous quarters

java - Hibernate - 回滚 : org. hibernate.MappingException:未知实体

php - 构建论坛数据库的最佳方式

mysql - Rails ActiveRecord 连接 session

php - MySQL 向 SET 元素添加值

仅当更改时 SQL MERGE