Ограничение в подзапросе запрещено в MySQL, но мне нужно "это"

Сначала SQL =

delete 
  from eat_history 
 where food in 
    ( select food 
        from eat_history 
      where name ='minicake' 
       and cream='yes' 
     order 
        by eat_time desc 
      limit 1
    ) t1

Я намерен удалить съеденную еду последний с названием 'minicake' и cream = 'yes' (может быть несколько предметов). MySQL не позволяет этого, как я указываю в заголовке. Однако в моем случае решающим моментом является «предел 1». Есть ли хороший обходной путь, лучше всего использовать один оператор SQL?

=====

Обновлено: Я нахожу ответ в другом вопросе, что, хотя MySQL не разрешает ограничение в предложении IN, но разрешено в подзапросе, например. добавить «выбрать * из» снаружи изначально «выбрать еду ...» можно обойти ограничение. Серьезно, я не знаю почему, но я тестирую, все в порядке.

Здесь вам не нужен подзапрос. Переместите предложения where и limit в основной запрос.

marekful 17.05.2018 16:22

Это похоже на обман. Ты съел торт. По крайней мере, признай это.

Strawberry 17.05.2018 16:28
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
110
1

Ответы 1

Сначала вы должны удалить t1 после предложения in

  delete from eat_history where food in (
      select food from eat_history where name='minicake' and cream='yes' 
      order by eat_time DESC  limit 1
      ) 

но вы можете избежать ограничения, используя группу путем объединения

  delete from eat_history  e 
  inner join  (
      select food, max(eat_time)  max_time
      from eat_history 
      where name='minicake' and cream='yes' 
      group by foo
 ) t on t.food = e.food and t.max_time = e.eat_time

в предыдущем запросе, который вы отправили, вы пропустили режим заказа DESC / ASC

Dixon 17.05.2018 17:16

@Dickson в первом порядке такой же, как в OP, а во втором - выберите только одну запись и не нуждаетесь в порядке

scaisEdge 17.05.2018 17:18

Я согласен, однако, с первым запросом без порядка сортировки MySQL будет сортировать в возрастающем порядке, поэтому вместо выбора последней записи он выберет первую, а затем удалит первую запись вместо последней / самой последней записи. . Видно, вы поправили. Ура, чувак

Dixon 17.05.2018 17:32

@Dickson .. правильно .. ответ обновлен .. хороший момент .. где-то проголосовали .. спасибо

scaisEdge 17.05.2018 17:33

@scaisEdge Сначала извините за отсутствие "desc", я изменил вопрос. Во-вторых, как я указываю в заголовке, ваш первый SQL также получит ошибку «Эта версия MySQL еще не поддерживает подзапрос LIMIT & IN / ALL / ANY / SOME». Я нашел ответ в другом вопросе, который решает эту проблему (напишу под вопросом). Однако ваш второй SQL - это еще один способ обойти это. Спасибо за ответ, и я проголосую за него.

Scott Chu 18.05.2018 03:38

Другие вопросы по теме