web-dev-qa-db-ja.com

MySQL LEFT JOINを使用して行を削除する

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

LEFT JOINを使用すると、簡単にSELECT基準を満たすジョブ/期限を設定できます:

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'

statusjobではなく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構文にエラーがあります。 'LEFT JOIN job ON deadline.job_id = job.job_id WHERE status =' szaml 'を1行目に使用する正しい構文については、MySQLサーバーバージョンに対応するマニュアルを確認

SELECTを有効なDELETEクエリに変換するにはどうすればよいですか?

168
fabrik

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` ....
307
Daniel Vassallo

「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
36
Roman Losev
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列があると仮定しています。

2
Francisco Soto

これを試して:

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

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

たとえば、指定された条件を満たすT1テーブルとT2テーブルの両方から行を削除するには、次のステートメントを使用します。

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

DELETEキーワードとFROMキーワードの間にテーブル名T1とT2を配置することに注意してください。 T1テーブルを省略すると、DELETEステートメントはT2テーブルの行のみを削除します。同様に、T2テーブルを省略すると、DELETEステートメントはT1テーブルの行のみを削除します。

この助けを願っています。

1
Tahir