MySQL LEFT JOINを使用した行の削除


186

2つのテーブルがあります。1つはジョブの締め切り、もう1つはジョブの説明です。各ジョブはステータスを取得でき、一部のステータスは、ジョブの期限を他のテーブルから削除する必要があることを意味します。

私は次のようにして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

しかし、これらの行をから削除したい場合deadline、MySQLはエラーをスローします。私のクエリは:

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」では、目的に合わせて機能させるために、句にエイリアスを使用する必要がありました(孤立したオブジェクトを削除)。
ウルス

興味深いことに、私のPHPMyAdmin 4.5.1構文チェッカーはDELETEとの間の何も受け入れませんFROMが、Goを押したときにクエリは正常に実行されました。
クレイレイ

38

「table as」を使用している場合は、削除するように指定します。

この例では、table_2に存在しないすべてのtable_1行を削除します。

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 2013年

DELETEとの間に記載されている表はありませんFROM
イスティアケアーメド2017

1

これを試して:

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

1

MySQLでは、DELETEステートメントでINNER JOIN句を使用して、テーブルから行を削除し、別のテーブルの一致する行を削除できます。

たとえば、指定した条件を満たす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.