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

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

0 голосов
/ 22 февраля 2019

Я хотел бы удалить свой выбор 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
)

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

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

Если предположить, что PK называется 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.Если у вас есть PK с несколькими столбцами, вам нужно выбрать все поля PK в производной таблице и объединить их все.

0 голосов
/ 22 февраля 2019

Первое, что нужно отметить, - это проблема с вашим запросом.Вы фильтруете по уникальному значению 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

0 голосов
/ 22 февраля 2019

Вы не предоставили определение вашей таблицы.Я думаю, у него есть столбец первичного ключа с именем 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, запрещающего LIMIT s в ... IN (SELECT ...) предложениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...