Menghapus baris dengan MySQL LEFT JOIN

186

Saya memiliki dua tabel, satu untuk tenggat waktu pekerjaan, satu untuk menggambarkan pekerjaan. Setiap pekerjaan dapat mengambil status dan beberapa status berarti tenggat waktu pekerjaan harus dihapus dari tabel lain.

Saya dapat dengan mudah SELECTpekerjaan / tenggat waktu yang memenuhi kriteria saya dengan 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'

( statusmilik jobtabel tidak deadline)

Tetapi ketika saya ingin menghapus baris-baris ini dari deadline, MySQL melempar kesalahan. Kueri saya adalah:

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'

Kesalahan MySQL tidak mengatakan apa-apa:

Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'LEFT JOIN jobON deadline.job_id = job.job_id WHERE status=' szaml 'di baris 1

Bagaimana cara mengubah saya SELECTmenjadi DELETEkueri yang berfungsi ?

fabrik
sumber

Jawaban:

335

Anda hanya perlu menentukan tabel mana yang akan diterapkan DELETE.

Hapus hanya deadlinebaris:

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

Hapus deadlinedan jobbaris:

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

Hapus hanya jobbaris:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....
Daniel Vassallo
sumber
4
Dengan "AS", saya harus menggunakan alias dalam klausa saya untuk membuatnya berfungsi untuk tujuan saya (menghapus anak yatim): HAPUS t1 DARI tabel1 SEBAGAI t1 KIRI BERGABUNG t2 AS t2 ON t1. Cairan = t2.result DIMANA t2.result ADALAH NULL
Urs
Menariknya, pemeriksa sintaks PHPMyAdmin 4.5.1 saya tidak akan menerima apa pun di antara DELETEdan FROM, tetapi kueri tetap berjalan baik ketika saya menekan Go.
clayRay
38

Jika Anda menggunakan "tabel sebagai", maka tentukan itu untuk dihapus.

Dalam contoh ini saya menghapus semua baris table_1 yang tidak ada di 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
sumber
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');

Saya tidak yakin apakah permintaan semacam itu berfungsi di MySQL, tetapi cobalah. Saya berasumsi Anda memiliki kolom ID di tabel tenggat waktu Anda.

Francisco Soto
sumber
1
OP masih perlu menentukan apa yang DELETEharus dilakukan agar permintaan tidak ambigu. Menggunakan Indengan subqueries membuat semuanya jauh lebih lambat. Sebaiknya dihindari.
Ian Atkin
Tidak ada tabel yang disebutkan antara DELETEdan FROM.
Istiaque Ahmed
1

Coba ini:

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

MySQL memungkinkan Anda untuk menggunakan klausa INNER JOIN dalam pernyataan DELETE untuk menghapus baris dari tabel dan baris yang cocok di tabel lain.

Misalnya, untuk menghapus baris dari tabel T1 dan T2 yang memenuhi kondisi tertentu, Anda menggunakan pernyataan berikut:

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

Perhatikan bahwa Anda meletakkan nama tabel T1 dan T2 antara kata kunci DELETE dan FROM. Jika Anda menghilangkan tabel T1, pernyataan DELETE hanya menghapus baris dalam tabel T2. Demikian pula, jika Anda menghapus tabel 2, pernyataan DELETE hanya akan menghapus baris dalam tabel T1.

Semoga bantuan ini.

Tahir
sumber