2010-05-04 26 views
143

Mam dwie tabele, jedną dla terminów pracy, jedną dla opisania pracy. Każde zadanie może mieć status, a niektóre statusy oznaczają, że terminy zadań muszą zostać usunięte z drugiej tabeli.Usuwanie wierszy za pomocą MySQL LEFT DOŁĄCZ

mogę łatwo SELECT zadań/terminów, które spełnia moje kryteria z 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 należący do job tabeli nie deadline)

Ale kiedy Chciałbym usunąć te wiersze od deadline, MySQL zgłasza błąd. Moje zapytanie brzmi:

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:

masz błąd w składni SQL; sprawdzić podręcznika, który odpowiada twojej wersji serwera MySQL dla prawego składnię używaną w pobliżu „LEFT JOIN job NA deadline.job_id = job.job_id GDZIE status =«szaml»at line 1

Jak mogę włączyć mój SELECT do działającego zapytania o numer: DELETE?

Odpowiedz

260

Po prostu trzeba określić, w których tabelach zastosować DELETE.

usunąć tylko deadline rzędy:

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

usunąć deadline i job wiersze:

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

usunąć tylko job rzędów:

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

Używaj także "status w (" szamlazva "," szamlazhato "," fizetve ", .........)" – Salil

+3

W "AS" musiałem użyć aliasu w mojej klauzuli, aby działało dla mojego Celem (usuwanie sierot): dELETE FROM t1 tabela1 AS t1 LEFT JOIN T2, T2 NA t1.uid = t2.result GDZIE t2.result IS NULL – Urs

+0

referencyjny: http://dev.mysql.com/doc/ refman/5.7/en/delete.html – Slawa

1
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 ten rodzaj pod-zapytania działa w MySQL, ale spróbuj. Zakładam, że w tabeli terminów znajduje się kolumna ID.

+1

OP nadal musi określać, co "USUŃ", aby zapytanie było jednoznaczne. Używanie 'In' z podkwerendami powoduje, że wszystko jest wolniejsze. Najlepiej tego unikać. –

+0

Brak tabeli wymienionej między "DELETE" i "FROM". –

25

Jeśli używasz „stół jako ", a następnie określić, aby usunąć.

W przykładzie i usunąć wszystkie table_1 wiersze, 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 
+0

@Roman Losev - Jaki jest sens WHERE 1 – vmanta

+0

To moja domyślna metoda wyboru ... Przepraszam, za to. Nie pamiętam, aby usunąć. Edytowano post. –