210 votes

Suppression de lignes avec MySQL LEFT JOIN

J'ai deux tableaux, l'un pour les échéances des travaux, l'autre 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 SELECT les emplois/délais qui répondent à mes critères avec une 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 la table n'est pas deadline )

Mais quand j'aimerais supprimer ces lignes de deadline MySQL lance une erreur. Ma requête est la suivante :

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 la syntaxe SQL ; consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser près de "LEFT JOIN". job ON deadline.job_id = job.job_id WHERE status = 'szaml' à la ligne 1

Comment puis-je transformer mon SELECT en un travail DELETE une requête ?

396voto

Daniel Vassallo Points 142049

Il suffit de spécifier sur quelles tables appliquer l'approche de la DELETE .

Ne supprimer que les deadline rangs :

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

Supprimer le deadline y job rangs :

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

Ne supprimer que les job rangs :

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

5 votes

Avec "AS", j'ai dû utiliser l'alias dans ma clause pour que cela fonctionne pour mon objectif (supprimer les orphelins) : DELETE t1 FROM table1 AS t1 LEFT JOIN t2 AS t2 ON t1.uid = t2.result WHERE t2.result IS NULL

0 votes

Il est intéressant de noter que le vérificateur de syntaxe de PHPMyAdmin 4.5.1 n'accepte rien entre DELETE y FROM mais la requête s'est quand même exécutée correctement lorsque j'ai appuyé sur Go.

43voto

Roman Losev Points 152

Si vous utilisez "tableau en tant que", indiquez-le pour 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

5voto

Francisco Soto Points 5043
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 table d'échéance.

1 votes

Le PO doit encore préciser ce qu'il faut DELETE pour rendre la requête non ambiguë. Utilisation de In avec des sous-requêtes rend tout beaucoup plus lent. Il est préférable de l'éviter.

0 votes

Aucune table mentionnée entre DELETE y FROM .

4voto

Rico Nguyen Points 155

Ce script a fonctionné pour moi :

DELETE t
FROM table t
INNER JOIN join_table jt ON t.fk_column = jt.id
WHERE jt.comdition_column…;

3voto

Zon Points 518

Essayez ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X