Удаление повторяющихся записей из БД MYSQL

212
31 января 2018, 12:05
DELETE *
FROM coins_info
WHERE (((coins_info.Код) Not In (SELECT Max(coins_info.Код) AS 'Max-Код' FROM coins_info GROUP BY coins_info.url_loaded, coins_info.name HAVING (((Count(*))>1))) And (coins_info.Код) Not In (SELECT Max(coins_info.Код) AS 'Max-Код' FROM coins_info GROUP BY coins_info.url_loaded, coins_info.name HAVING (((Count(*))=1)))));

Перевожу запросы с Access на MуSQL, на сколько понимаю, SELECT от DELETE отличается только самим словом SELECT/DELETE, так вот, в данном случае SELECT работает, а когда меняю на DELETE, получаю ошибку

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*
  FROM coins_info
  WHERE (((coins_info.Код) Not In (SELECT Max(coins_info.К' at line 1

брал "Код" в ``, ничего не изменилось, что еще нужно поменять чтобы запрос заработал?

UPD: видимо простой правкой запроса не отделаться, придется переделывать его, опишу задачу:

Есть таблица coins_info

Код name symbol price1 price2 date_load url_loaded
157370  garli   grlc        0,00026397  3,08043         2018-01-28 18:49:00 https://11111
157371  solaris xlr     0,00181792  21,2144         2018-01-28 18:52:00 https://11111
157372  garli   grlc        0,00053393  6,23074         2018-01-28 19:05:00 https://11111
157377  pirl    pirl        0,00019997  2,33359         2018-01-28 19:08:00 https://22222
157378  garli   grlc        0,00053391  6,23071         2018-01-28 19:11:00 https://22222

Из нее нужно удалить все повторяющиеся старые записи по name, symbol и url_loaded, т.е. в данном случае должна удалиться только первая строка. Код выше отлично работал в Access, сейчас необходимо перевести на MySQL, во многих запросах достаточно удалить [ и ] из тела запроса и все работает прекрасно, здесь же затык какой-то.

Answer 1

Если вы хотите для сочетаний name, symbol оставить только самую свежую запись, то примерно так:

  • Находим name, symbol, max(date_load) для сочетания name, symbol

  • Теперь находим name, symbol, date_load, не совпадающие с найденными на первом шаге

  • И все их удаляем

Вот такая конструкция

 delete t1 from coins_info t1
         join  
           (select name, symbol, date_load 
              from coins_info t2 
              where (name, symbol, date_load) not in 
                (select name, symbol, max(date_load) 
                   from coins_info 
                group by name, symbol)
           ) as t3 
         using (name, symbol, date_load)  

sqlfiddle

READ ALSO
LINQ Добавить строку в каждые 5 позиций списка

LINQ Добавить строку в каждые 5 позиций списка

Помогите переписать код с помощью Linq

243
Обрезать окно другого приложения

Обрезать окно другого приложения

Есть звонилка, внизу у нее постоянно реклама висит, что раздражаетВозникла идея не блочить сервер рекламы, а просто обрезать снизу, либо серый...

227
Как преобразовать “\\n”, “\\t” в “\n”, “\t”

Как преобразовать “\\n”, “\\t” в “\n”, “\t”

Я беру из текстового файла содержимое вида:

211