Удалить выбор MySQL

Я хотел бы удалить свой выбор MySQL.

Вот мой запрос на выбор MySQL:

SELECT * 
  FROM Items 
 WHERE id_user=1 
 ORDER 
    BY id_user 
 LIMIT 2,1

С помощью этого рабочего запроса я выбираю третий элемент на моем столе, который имеет значение id_user: 1.

Теперь я хотел бы удалить элемент, который был выбран по моему запросу.

Я ищу такой же смысловой запрос, который будет выглядеть так:

DELETE FROM Items (
   SELECT * FROM Items WHERE id_user=1 ORDER BY id_user LIMIT 2,1
)
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
53
3

Ответы 3

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

В этом случае вы можете использовать это

CREATE TEMPORARY TABLE doomed_ids 
    SELECT id FROM Items WHERE id_user = 1 ORDER BY id_user LIMIT 2,1;
DELETE FROM Items
      WHERE id IN ( SELECT id FROM doomed_ids);
DROP TABLE doomed_ids;

Это головная боль, но она работает в обход ограничений MySQL и MariaDB, запрещающих LIMITs в ... IN (SELECT ...) предложениях.

(Ограничение - это смещение)

Strawberry 22.02.2019 07:57

Вы можете использовать запрос на выборку, чтобы создать производную таблицу и соединить ее с основной таблицей, чтобы определить, какие записи нужно удалить. Производные таблицы могут использовать предложение limit.

Если предположить, что ПК называется id, запрос будет выглядеть следующим образом:

delete i from items i
inner join (SELECT id FROM Items 
            WHERE id_user=1 
            ORDER BY id_user LIMIT 2,1) i2 on i.id=i2.id

Вам нужно подставить свой PK вместо id. Если у вас есть ПК с несколькими столбцами, вам нужно выбрать все поля ПК в производной таблице и присоединиться ко всем из них.

(Компенсационная оговорка)

Strawberry 22.02.2019 07:56

Первое, что нужно отметить, это то, что с вашим запросом возникла проблема. Вы фильтрация по уникальному значению id_user и сортировка по тому же столбцу. Поскольку все записи в наборе результатов будут иметь одинаковые id_user, фактический порядок набора результатов не определен, и мы не можем достоверно сказать, какая запись идет третьей.

Предполагая, что у вас есть еще один столбец для устранения неоднозначности набора результатов (т. е. какое-то значение, уникальное среди каждой группы записей, имеющих одно и то же id_user), скажем, id, вот решение вашего вопроса, в котором используется самообъединение с ROW_NUMBER() для поиска третья запись в каждой группе.

DELETE i
FROM items i
INNER JOIN (
    SELECT 
        id, 
        id_user, 
        ROW_NUMBER() OVER(PARTITION BY id_user ORDER BY id) rn
    FROM items
) c ON c.id = i.id AND c.id_user = i.id_user AND c.rn = 3
WHERE i.id_user=1 ;

Демонстрация на DB Fiddle

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