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 ?

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

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

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.


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.