Удаление строк с помощью MySQL LEFT JOIN - PullRequest
168 голосов
/ 04 мая 2010

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

Я могу легко 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 job ON deadline.job_id = job.job_id WHERE status =' szaml 'в строке 1

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

Ответы [ 5 ]

303 голосов
/ 04 мая 2010

Вам просто нужно указать, к каким таблицам применять 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` ....
35 голосов
/ 16 мая 2013

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

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

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL
2 голосов
/ 04 мая 2010
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 голос
/ 19 февраля 2019

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.

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

1 голос
/ 15 июля 2018

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

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123
...