Удаление строк с помощью MySQL LEFT JOIN

186

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

Я могу легко SELECTработать / сроки, которые соответствуют моим критериям с LEFT JOIN:

SELECT * FROM `deadline`
LEFT JOIN `job` ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

( statusпринадлежит к jobтаблице нет deadline)

Но когда я хотел бы удалить эти строки deadline, MySQL выдает ошибку. Мой запрос:

DELETE FROM `deadline`
LEFT JOIN `job`
ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

Ошибка MySQL ничего не говорит:

У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с 'LEFT JOIN jobON deadline.job_id = job.job_id WHERE status=' szaml 'в строке 1

Как я могу превратить мой SELECTв рабочий DELETEзапрос?

Fabrik
источник

Ответы:

335

Вам просто нужно указать, к каким таблицам применять DELETE.

Удалить только deadlineстроки:

DELETE `deadline` FROM `deadline` LEFT JOIN `job` ....

Удалите deadlineи jobстроки:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` ....

Удалить только jobстроки:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....
Даниэль Вассалло
источник
4
С "AS" мне пришлось использовать псевдоним в моем предложении, чтобы заставить его работать для моей цели (удалить сирот): УДАЛИТЬ t1 ИЗ таблицы1, КАК t1, СЛЕДУЕТ ПОДКЛЮЧИТЬ t2, КАК t2 ON t1.uid = t2.result ГДЕ t2.result IS NULL
Urs
Интересно, что моя проверка синтаксиса PHPMyAdmin 4.5.1 не принимала ничего между DELETEи FROM, но запрос все равно работал нормально, когда я нажимал Go.
clayRay
38

Если вы используете «таблица как», укажите ее для удаления.

В этом примере я удаляю все строки таблицы_1, которых нет в таблице_2.

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL
Роман Лосев
источник
4
DELETE FROM deadline where ID IN (
    SELECT d.ID FROM `deadline` d LEFT JOIN `job` ON deadline.job_id = job.job_id WHERE `status` =  'szamlazva' OR `status` = 'szamlazhato' OR `status` = 'fizetve' OR `status` = 'szallitva' OR `status` = 'storno');

Я не уверен, что подобный подзапрос работает в MySQL, но попробуйте. Я предполагаю, что у вас есть столбец ID в вашей таблице крайних сроков.

Франсиско Сото
источник
1
OP все еще должен указать, что DELETEделать запрос однозначным. Использование Inс подзапросами делает все намного медленнее. Лучше всего избегать
Ян Аткин
Нет таблицы, упомянутой между DELETEи FROM.
Истак Ахмед
1

Попробуй это:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123
Зон
источник
1

MySQL позволяет использовать предложение INNER JOIN в операторе DELETE для удаления строк из таблицы и соответствующих строк в другой таблице.

Например, чтобы удалить строки из таблиц T1 и T2, которые удовлетворяют указанному условию, используйте следующую инструкцию:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;

Обратите внимание, что вы помещаете имена таблиц T1 и T2 между ключевыми словами DELETE и FROM. Если вы опустите таблицу T1, оператор DELETE удалит только строки в таблице T2. Точно так же, если вы опустите таблицу T2, оператор DELETE удалит только строки в таблице T1.

Надеюсь, это поможет.

Тахир
источник