Usuwanie wierszy za pomocą MySQL LEFT JOIN

186

Mam dwie tabele, jedną dotyczącą terminów pracy, drugą opisującą pracę. Każde zadanie może mieć status, a niektóre statusy oznaczają, że terminy zadań muszą zostać usunięte z drugiej tabeli.

Mogę z łatwością SELECTobsadzić stanowiska / terminy spełniające moje kryteria za pomocą 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'

(nie statusnależy do jobtabeli deadline)

Ale gdy chcę usunąć te wiersze deadline, MySQL zgłasza błąd. Moje zapytanie to:

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'

Błąd MySQL nic nie mówi:

Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, aby użyć właściwej składni w pobliżu „LEFT JOIN jobON deadline.job_id = job.job_id WHERE status= 'szaml” w wierszu 1

Jak mogę zmienić moje zapytanie w SELECTdziałające DELETE?

fabrik
źródło

Odpowiedzi:

334

Musisz tylko określić, w których tabelach zastosować DELETE.

Usuń tylko deadlinewiersze:

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

Usuń deadlinei jobwiersze:

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

Usuń tylko jobwiersze:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....
Daniel Vassallo
źródło
4
Z „AS” musiałem użyć aliasu w mojej klauzuli, aby działał dla mojego celu (usuń sieroty): USUŃ t1 Z tabeli 1 AS t1 LEWE DOŁĄCZ t2 AS t2 NA t1.uid = t2.wynik GDZIE t2.wynik jest NULL
Urs
Co ciekawe, mój moduł sprawdzania składni PHPMyAdmin 4.5.1 nie zaakceptowałby niczego pomiędzy DELETEi FROM, ale zapytanie i tak działało poprawnie po naciśnięciu Go.
clayRay
38

Jeśli używasz opcji „Tabela jako”, określ ją do usunięcia.

W tym przykładzie usuwam wszystkie wiersze table_1, które nie istnieją w table_2.

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL
Roman Losev
źródło
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');

Nie jestem pewien, czy tego rodzaju kwerenda podrzędna działa w MySQL, ale spróbuj. Zakładam, że masz tabelę identyfikatorów w tabeli terminów.

Francisco Soto
źródło
1
OP nadal musi określić, co DELETEma uczynić zapytanie jednoznacznym. Korzystanie Inz podkwerend sprawia, że ​​wszystko jest o wiele wolniejsze. Najlepiej tego unikać.
Ian Atkin
Nie wymieniono tabeli między DELETEa FROM.
Istiaque Ahmed,
1

Spróbuj tego:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123
Strefa
źródło
1

MySQL pozwala na użycie klauzuli INNER JOIN w instrukcji DELETE do usuwania wierszy z tabeli i pasujących wierszy z innej tabeli.

Na przykład, aby usunąć wiersze zarówno z tabel T1, jak i T2, które spełniają określony warunek, użyj następującej instrukcji:

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

Zauważ, że umieszczasz nazwy tabel T1 i T2 między słowami kluczowymi DELETE i FROM. W przypadku pominięcia tabeli T1 instrukcja DELETE usuwa tylko wiersze w tabeli T2. Podobnie, jeśli pominiesz tabelę T2, instrukcja DELETE usunie tylko wiersze w tabeli T1.

Mam nadzieję, że to pomoże.

Tahir
źródło