การลบแถวด้วย MySQL LEFT JOIN


186

ฉันมีสองตารางหนึ่งตารางสำหรับงานกำหนดเวลาหนึ่งตารางสำหรับอธิบายงาน แต่ละงานสามารถรับสถานะได้และบางสถานะหมายถึงกำหนดเวลางานที่ต้องลบออกจากตารางอื่น

ฉันสามารถSELECTหางาน / กำหนดเวลาที่ตรงกับเกณฑ์ของฉันด้วย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เป็นของjobตารางไม่ได้deadline)

แต่เมื่อฉันต้องการลบแถวเหล่านี้ออกdeadlineMySQL จะพ่นข้อผิดพลาด คำถามของฉันคือ:

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 พูดอะไร:

คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องใกล้ 'LEFT JOIN jobON deadline.job_id = job.job_id WHERE status=' szaml 'ที่บรรทัด 1

ฉันจะเปลี่ยนSELECTเป็นDELETEคำถามที่ทำงานได้อย่างไร

คำตอบ:


335

คุณเพียงแค่ต้องระบุว่าจะใช้ตารางDELETEใด

ลบdeadlineแถวเท่านั้น:

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

ลบแถวdeadlineและjob:

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

ลบjobแถวเท่านั้น:

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

4
ด้วย "AS" ฉันต้องใช้นามแฝงในข้อของฉันเพื่อให้ทำงานได้ตามวัตถุประสงค์ของฉัน (ลบเด็กกำพร้า): ลบ t1 จาก table1 เป็น t1 ซ้ายเข้าร่วม t2 เป็น t2 เมื่อ t1.uid = t2.result ที่ใดที่ t2.result IS NULL
Urs

ที่น่าสนใจคือตัวตรวจสอบไวยากรณ์ PHPMyAdmin 4.5.1 ของฉันจะไม่ยอมรับสิ่งใดระหว่างDELETEและFROMแต่ข้อความค้นหาก็โอเคอยู่ดีเมื่อฉันกดไป
clayRay

38

หากคุณใช้ "ตารางเป็น" ให้ระบุเพื่อลบ

ในตัวอย่างฉันลบ table_1 แถวทั้งหมดซึ่งไม่มีอยู่ใน 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');

ฉันไม่แน่ใจว่าแบบสอบถามย่อยประเภทนั้นทำงานใน MySQL ได้หรือไม่ ฉันสมมติว่าคุณมีคอลัมน์ ID ในตารางกำหนดเวลาของคุณ


1
OP ยังคงต้องระบุสิ่งที่DELETEจะทำให้แบบสอบถามไม่คลุมเครือ การใช้งานInกับแบบสอบถามย่อยทำให้ทุกอย่างช้าลงมาก เป็นการหลีกเลี่ยงที่ดีที่สุด
Ian Atkin

ตารางไม่มีกล่าวถึงระหว่างและDELETE FROM
Istiaque Ahmed

1

ลองสิ่งนี้:

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

1

MySQL อนุญาตให้คุณใช้ส่วนคำสั่ง INNER JOIN ในคำสั่ง DELETE เพื่อลบแถวออกจากตารางและแถวที่ตรงกันในตารางอื่น

ตัวอย่างเช่นในการลบแถวออกจากทั้งตาราง T1 และ T2 ที่ตรงตามเงื่อนไขที่ระบุคุณใช้คำสั่งต่อไปนี้:

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

โปรดสังเกตว่าคุณใส่ชื่อตาราง T1 และ T2 ระหว่างคำหลัก DELETE และ FROM หากคุณเว้นตาราง T1 คำสั่ง DELETE จะลบแถวในตาราง T2 เท่านั้น ในทำนองเดียวกันถ้าคุณละเว้นตาราง T2 คำสั่ง DELETE จะลบเฉพาะแถวในตาราง T1

หวังว่าความช่วยเหลือนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.