Удаление строк с наименьшим параметром mySQL

275
12 апреля 2017, 13:15

Начал изучать SQL, разобрался с базовыми командами, но столкнулся с проблемой: есть таблица с тремя колонками id, amount и currency (id - Primary key). И я хочу удалить 3 строки, где currency будет 'EUR', а amount будет наименьшим. То есть мне нужно удалить наименьшие amount, где currency 'EUR'. Не могу понять как это записать в SQL.

Answer 1

Нужно в подзапросе получить эти минимальные значения, и из второй копии таблицы, связанной по нему, удалять. Альтернатива - две копии, связанные по неравенству, и удаление записей, не имеющих соответствия.

Вариант 1:

delete t1.*
from table t1, (select min(t2.amount) amount 
                from table t2 
                where t2.currency = 'EUR'
               ) t3
where t1.currency = 'EUR' 
  and t1.amount = t3.amount

Вариант 2:

delete t1.*
from table t1
left join table t2 
       on t1.currency = 'EUR'
      and t2.currency = 'EUR'
      and t1.amount > t2.amount
where t2.amount is null

PS. Вот только не понимаю, почему именно "3 строки".

Answer 2

Что Вы имели ввиду, когда писали "amount будет наименьшим"? Это можно понять и как "3 строки, где amount будет равен наименьшему значению в таблице", и как "3 строки с самыми маленькими значениями amount в таблице" (то есть эти значения меньше чем в других строках, но они могут быть разными). Один ответ Вам уже вроде бы дали. Он основан на первой трактовке вопроса, но он не учитывает количество строк = 3. Это можно исправить добавив LIMIT 3. Однако LIMIT нельзя использовать с многотабличным DELETE (когда в секции FROM перечислены несколько таблиц). Если переписать запрос с помощью подзапроса в секции WHERE, думаю LIMIT заработает. Но я всё же склоняюсь ко второй трактовке Вашего вопроса. В этом случае надо думать о сортировке по полю amount:

delete from t
where t.currency = 'EUR'
order by t.amount asc
limit 3;
READ ALSO
Экранирование ввода

Экранирование ввода

Подскажите какое экранирование сделать для полей "ФИО" "телефон" и "Описание"На данный момент у меня следующее

176
Не обновляет данные в БД(PDO)

Не обновляет данные в БД(PDO)

Всем доброго времени сутокНаписал метод обновление данных,но почему то работает ооооочень криво title = при отправке запроса меняет то 0,то...

200
Самопроизвольное срабатывание кода

Самопроизвольное срабатывание кода

Есть простой пример кода игры-угадайки

238
Сервер для android игры

Сервер для android игры

На что ставят (VPS или что там) и на чём пишут сервера для Android-игр? Соединение держится между клиентом и сервером с помощью сокетов?

203