580 votes

Supprimer avec Join dans MySQL

 CREATE TABLE `clients` (
   `client_id` int(11),
   PRIMARY KEY (`client_id`)
);
CREATE TABLE `projects` (
   `project_id` int(11) unsigned,
   `client_id` int(11) unsigned,
   PRIMARY KEY (`project_id`)
);
CREATE TABLE `posts` (
   `post_id` int(11) unsigned,
   `project_id` int(11) unsigned,
   PRIMARY KEY (`post_id`)
);
 

Dans mon code PHP, lors de la suppression d'un client, je souhaite supprimer les messages de tous les projets:

 DELETE 
FROM posts

INNER JOIN projects 
  ON projects.project_id = posts.project_id

WHERE projects.client_id = :client_id;
 

La table posts n'a pas de clé étrangère client_id , seulement project_id . Je souhaite supprimer les publications postées dans les projets dont le client_id passé.

Cela ne fonctionne pas pour le moment (aucun message n'est supprimé).

1453voto

Yehosef Points 3761
DELETE posts
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

53voto

Property Spain Points 71

Vous pouvez également utiliser ALIAS comme ça, ça marche juste sur ma base de données! t est la table doit supprimer de!

 DELETE t FROM posts t
INNER JOIN projects p ON t.project_id = p.project_id
AND t.client_id = p.client_id
 

52voto

ivanhoe Points 643

Ou la même chose, avec une syntaxe légèrement différente (IMO plus conviviale):

 DELETE FROM posts 
USING posts, projects 
WHERE projects.project_id = posts.project_id AND projects.client_id = :client_id;
 

BTW, avec mysql utilisant des jointures est presque toujours un moyen plus rapide que les sous-requêtes ...

29voto

yukondude Points 8756

Je suis plus habitué à la solution de sous-requête, mais je ne l'ai pas essayé dans MySQL:

 DELETE  FROM posts
WHERE   project_id IN (
            SELECT  project_id
            FROM    projects
            WHERE   client_id = :client_id
        );
 

7voto

Essayez comme ci-dessous:

 DELETE posts.*,projects.* 
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
 

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