web-dev-qa-db-fra.com

Supprimer des lignes avec MySQL LEFT JOIN

J'ai deux tables, une pour les délais de travail, une pour décrire un travail. Chaque travail peut prendre un statut et certains statuts signifient que les échéances des travaux doivent être supprimées de l'autre tableau.

Je peux facilement SELECT les emplois/délais qui répondent à mes critères avec un 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 appartient à job table pas deadline)

Mais lorsque je souhaite supprimer ces lignes de deadline, MySQL renvoie une erreur. Ma requête est:

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'

L'erreur MySQL ne dit rien:

Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe correcte à utiliser près de 'LEFT JOIN job le on delay.job_id = job.job_id WHERE status =' szaml 'à la ligne 1

Comment transformer mon SELECT en une requête DELETE fonctionnelle?

168
fabrik

Vous devez simplement spécifier sur quelles tables appliquer le DELETE.

Ne supprimez que les rangées deadline:

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

Supprimez les lignes deadline et job:

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

Ne supprimez que les rangées job:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....
307
Daniel Vassallo

Si vous utilisez "table en tant que", spécifiez le supprimer.

Dans l'exemple, je supprime toutes les lignes de la table_1 qui n'existent pas dans la table_2.

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

Je ne suis pas sûr que ce type de sous-requête fonctionne dans MySQL, mais essayez-le. Je suppose que vous avez une colonne ID dans votre tableau d'échéance.

2
Francisco Soto

Essaye ça:

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

MySQL vous permet d'utiliser la clause INNER JOIN dans l'instruction DELETE pour supprimer des lignes d'une table et les lignes correspondantes d'une autre table.

Par exemple, pour supprimer les lignes des tables T1 et T2 qui répondent à une condition spécifiée, utilisez l'instruction suivante:

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

Notez que vous mettez les noms de table T1 et T2 entre les mots clés DELETE et FROM. Si vous omettez la table T1, l'instruction DELETE supprime uniquement les lignes de la table T2. De même, si vous omettez la table T2, l'instruction DELETE supprimera uniquement les lignes de la table T1.

J'espère que cette aide.

1
Tahir