Видалення рядків за допомогою 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)

Але коли я хотів би видалити ці рядки з deadlineMySQL видає помилку. Мій запит:

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 END.job_id = job.job_id WHERE status=‘ szaml ’у рядку 1

Як я можу перетворити свій SELECTробочий DELETEзапит?

Відповіді:


334

Вам просто потрібно вказати, до яких таблиць слід застосувати 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 AS t2 ON t1.uid = t2.result ДЕ t2.result NULL
Urs

Цікаво, що мій PHPMyAdmin 4.5.1 перевірка синтаксису не буде нічого між прийняти DELETEі FROM, але запит побіг КІ в будь-якому випадку , коли я натиснув Go.
clayRay

38

Якщо ви використовуєте "таблицю як", то вкажіть її для видалення.

У прикладі я видаляю всі рядки table_1, яких немає у table_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, але спробуйте. Я припускаю, що у таблиці термінів є стовпчик посвідчення особи.


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.

Сподіваюся, що це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.