Supprimer des lignes avec MySQL LEFT JOIN

186

J'ai deux tableaux, un pour les délais de travail, un pour décrire un travail. Chaque travail peut prendre un statut et certains statuts signifient que les délais des travaux doivent être supprimés de l'autre table.

Je peux facilement SELECTles 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'

( statusn'appartient pas à la jobtable deadline)

Mais lorsque je souhaite supprimer ces lignes deadline, MySQL génère 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; vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'LEFT JOIN jobON date limite.job_id = job.job_id WHERE status=' szaml 'à la ligne 1

Comment puis-je transformer mon SELECTen une DELETErequête fonctionnelle ?

fabrik
la source

Réponses:

335

Il vous suffit de spécifier sur quelles tables appliquer le DELETE .

Supprimer uniquement les deadlinelignes:

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

Supprimez les lignes deadlineet job:

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

Supprimer uniquement les joblignes:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....
Daniel Vassallo
la source
4
Avec "AS", j'ai dû utiliser l'alias dans ma clause pour le faire fonctionner dans mon but (supprimer les orphelins): SUPPRIMER t1 DE table1 AS t1 GAUCHE JOIN t2 AS t2 ON t1.uid = t2.result O WH t2.result EST NULL
Urs
Fait intéressant, mon vérificateur de syntaxe PHPMyAdmin 4.5.1 n'accepterait rien entre DELETEet FROM, mais la requête s'est bien déroulée quand j'ai appuyé sur Go.
clayRay
38

Si vous utilisez "table as", indiquez-le à supprimer.

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

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL
Roman Losev
la source
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');

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 des délais.

Francisco Soto
la source
1
OP doit toujours spécifier quoi faire DELETEpour que la requête soit sans ambiguïté. L'utilisation Inavec des sous-requêtes rend tout beaucoup plus lent. Il vaut mieux éviter.
Ian Atkin
Aucun tableau mentionné entre DELETEet FROM.
Istiaque Ahmed
1

Essaye ça:

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

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 des lignes des tables T1 et T2 qui remplissent une condition spécifiée, vous utilisez l'instruction suivante:

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

Notez que vous placez 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.

Tahir
la source