@available

Взять рандомную строку с удалением?

Помогите составить запрос для выборки рандомной строки с удалением. Поиском в инете составил такой запрос:
DELETE FROM cat_product
WHERE IN
(
SELECT * FROM cat_product
ORDER BY RAND()
LIMIT 1
)

Если я правильно понял, первым выполняется запрос в кавычках, потом WHERE IN указываем что удалить. Я не спец в запросах, поиском ни чего не нашел.
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
запрос для выборки рандомной строки с удалением.
Так для выборки или для удаления?
Во первых - задача какая стоит? По описанию похоже на лютый треш.
Во вторых - ордер бай ранд - ОЧЕНЬ затратная операция, ее лучше не использовать на более-менее больших таблицах.
В третьих - WHERE `имя_поля` IN (select `имя_поля`... , но вроде более старые версии мускуля такое не поддерживают.

Если вы нормально опишете зачем вы удаляете рандомную строку, будет проще понять что надо сделать на самом деле.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Kuzmin_A
Full stack web developer
Я не сильный знаток, но
1. в данном случае вы просто удалите строку без её получения.
2. Моё видение
2.1 разбить на 2 запроса, select+delete
2.2 хранимая процедура либо без оной, сохраняете в переменную( не очень хорошо знаю использование переменных), затем из переменной берете свой PK и удаляете запись, после чего возвращаете значение переменной
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега MySQL
Ваш запрос похож на попытку удаления случайной строки из базы.
Это действительно можно сделать одним запросом.
Вот он:
DELETE FROM `cat_product` WHERE `id` IN (SELECT `inner`.`id` FROM(
    SELECT  `cat_product`.`id` FROM `cat_product` ORDER BY RAND() LIMIT 1
) as `inner`)


Если это не то чего вы хотели, то, пожалуйста, чётко сформулируйте в тексте вопроса желаемый результат. Максимально подробно.
Ответ написан
@available Автор вопроса
Почему я не могу в 2 запроса, взять одним и удалить другим. Да все просто, я работаю через конструктор, и пока я буду удалять строку на другом экшне, другой поток её считает, и будет треш в виде дубля.
61a7c3fb60a71811813098.png
Где черта, возможная задержка, где другой поток возьмет эту же строку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы