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?

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` ....

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

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.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.