MySQL LEFT JOIN ile satırları silme


186

Biri iş tanımları için, biri iş tanımlamak için olmak üzere iki masam var. Her iş bir durum alabilir ve bazı durumlar işlerin son teslim tarihlerinin diğer tablodan silinmesi gerektiği anlamına gelir.

SELECTÖlçütlerimi karşılayan işleri / son teslim tarihlerini aşağıdakilerle kolayca yapabilirim 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'

( tabloya statusait jobdeğil deadline)

Ancak bu satırları silmek istediğimde deadline, MySQL hata veriyor . Sorgum:

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'

MySQL hatası hiçbir şey söylemiyor:

SQL sözdiziminizde bir hata var; 1. satırda 'LEFT JOIN jobON deadline.job_id = job.job_id WHERE status=' szaml ' yakınında kullanılacak doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın

Nasıl SELECTçalışan bir DELETEsorguya dönüştürebilirim ?

Yanıtlar:


335

Hangi tablolara uygulanacağını belirtmeniz yeterlidir. DELETE .

Yalnızca deadlinesatırları silin :

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

deadlineVe jobsatırlarını silin :

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

Yalnızca jobsatırları silin :

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

4
"AS" ile yan tümcemdeki takma adı amacım için çalışmak zorunda kaldım (yetimleri sil): t1 tablo1'DEN SİLME t1 SOL t2 AÇIK t2 AS t2 AÇIK t1.uid = t2.result NEREDE t2.result NULL IS NULL
Urs

İlginç bir şekilde, benim PHPMyAdmin 4.5.1 sözdizimi denetleyicisi DELETEve arasında hiçbir şey kabul etmeyecekti FROM, ancak Go'ya bastığımda sorgu yine de tamamlandı.
clayRay

38

"Tablo olarak" kullanıyorsanız, silinecek dosyayı belirtin.

Örnekte, table_2 içinde bulunmayan tüm table_1 satırlarını siliyorum.

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');

Bu tür bir alt sorgunun MySQL'de çalışıp çalışmadığından emin değilim, ancak deneyin. Son tarih tablonuzda bir kimlik sütununuz olduğunu varsayıyorum.


1
OP'nin DELETEsorguyu kesinleştirmek için ne yapacağını belirtmesi gerekiyor . InAlt sorgularla kullanmak her şeyi çok daha yavaş hale getirir. En iyi kaçınılması.
Ian Atkin

Hiçbir tablo arasındaki söz DELETEve FROM.
Istiaque Ahmed

1

Bunu dene:

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

1

MySQL, bir tablodaki satırları ve başka bir tablodaki eşleşen satırları silmek için DELETE deyimindeki INNER JOIN yan tümcesini kullanmanızı sağlar.

Örneğin, belirtilen koşulu karşılayan T1 ve T2 tablolarındaki satırları silmek için aşağıdaki ifadeyi kullanırsınız:

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

T1 ve T2 tablo adlarını DELETE ve FROM anahtar sözcükleri arasına koyduğunuza dikkat edin. T1 tablosunu atlarsanız, DELETE deyimi yalnızca T2 tablosundaki satırları siler. Benzer şekilde, omitT2 tablosunu kullanırsanız, DELETE deyimi yalnızca T1 tablosundaki satırları siler.

Umarım bu yardım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.