Удалить дубликаты записей в MYSQL с условием

0

Я использую команду, которая запускается каждую секунду на node.js. Она имеет функцию исключения любых дубликатов записей для данного элемента, который указан в примере: AND t1.auction_id = 1335.

DELETE FROM bid_account t1
WHERE t1.id < (Select max(t1.id) FROM bid_account t2 WHERE t1.bidding_price = t2.bidding_price) AND t1.auction_id = 1335;

Мне нужно, чтобы удалить запись, которая имеет равное значение в столбце bidding_price, и сохранить только один. Но важно, чтобы он выполнял этот поиск не через таблицу, а скорее для определенного элемента, как я сообщал в начале, через столбец auction_id.

Я попытался запустить указанную выше команду, но она возвращает следующую ошибку:

#1064 - You have a syntax error in your SQL next to 't1
WHERE t1.id < (Select max(t1.id) FROM bid_account t2 WHERE t1.bidding_price ' na linha 1

Что не так с этим запросом?

Я использую базу данных MYSQL, а таблица bid_account имеет столбец id как индекс и первичный.

Если я использую SELECT ниже, он обычно возвращает значения в двуличности.

SELECT bidding_price, count(*) FROM bid_account WHERE 'auction_id' = 1335 GROUP BY bidding_price Having Count(*) > 1
Теги:

2 ответа

0
Лучший ответ

У вас есть две черты из MySQL. Во-первых, когда вы используете псевдоним для таблицы, он должен следовать DELETE. Итак, это то, что вы намерены:

DELETE ba FROM bid_account  ba
WHERE ba.id < (Select max(ba2.id)  -- I assume you want the max from the innter reference
               FROM bid_account ba2
               WHERE ba2.bidding_price = ba.bidding_price
              ) AND
      ba.auction_id = 1335;

Однако это все равно не будет работать, потому что вы ссылаетесь на bid_account в таблице.

Итак, я думаю, вам нужно что-то большее:

DELETE ba
    FROM bid_account ba JOIN
         (SELECT ba2.auction_id, ba2.bidding_price, MAX(ba2.id) as max_id  -- I assume you want the max from the innter reference
          FROM bid_account ba2
          WHERE ba2.auction_id = 1335
          GROUP BY ba2.auction_id, ba2.bidding_price
         ) ba2
         ON ba2.auction_id = ba.ba2.auction_id AND
            ba2.bidding_price = ba.bidding_price AND
            ba2.max_id > ba.id
WHERE ba.auction_id = 1335;

Это все еще не кажется мне полезным. Сравнение строк на основе bidding_price кажется необычным. Я бы ожидал, что auction_id станет частью матча. Я подозреваю, что вы хотите GROUP BY и JOIN на bidding_price и auction_id.

  • 0
    Моя проблема в том, что в таблице bid_account есть много записей, тысячи, поэтому мне нужно что-то альтернативное, что не займет много времени для запуска, потому что в этом случае произойдет сбой.
  • 0
    Я думаю, что это неправильно, не так ли? WHERE ba.id < AND ba.auction_id = 1335;
Показать ещё 9 комментариев
0

Вы можете удалить строку с помощью псевдонима до ключевого слова в sql-запросе

например

удалите t из теста t, где t.id = 3

Таким образом, ваш запрос будет работать нормально DELETE t1 FROM bid_account t1 WHERE t1.id <(Выбрать max (t1.id) FROM bid_account t2 WHERE t1.bidding_price = t2.bidding_price) И t1.auction_id = 1335;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню