2011-09-08 4 views
0

J'ai un problème avec une requête SQL est la suivante, je dois supprimer certaines données, mais les parents référencés et les enfants de ces documents, par exemple:MySQL erreur de requête

mysql> select * from menu; 
+--------+-------------------+-----------+-----------------------------------+ 
| menuId | menuNome   | menuIdPai | menuLink       | 
+--------+-------------------+-----------+-----------------------------------+ 
|  1 | A Empresa   |   0 | empresa.php      | 
|  2 | Sobre Nós   |   1 | sobre.php       | 
|  3 | Objetivos   |   1 | objetivos.php      | 
|  4 | Contato   |   0 | contato.php      | 
|  5 | Produtos   |   0 | produtos.php      | 
|  6 | Informática  |   5 | categoria.php?cat=informatica  | 
|  7 | Missão da Empresa |   2 | missao.php      | 
|  8 | Visão da Empresa |   2 | visao.php       | 
|  9 | Televisão   |   5 | categoria.php?cat=televisao  | 
|  10 | Computadores  |   6 | subcategoria.php?sub=computadores | 
|  11 | Monitores   |   6 | subcategoria.php?sub=monitores | 
+--------+-------------------+-----------+-----------------------------------+ 

supprimer le menu requête avec id 5 et tous leurs enfants et leurs parents si je fais une sélection normale, avec les données que vous souhaitez supprimer, je suis généralement le résultat, voir:

mysql> select * from menu where menuId = 5 or menuIdPai in((select menuId from menu where menuIdPai = 5 or menuId = 5)); 
+--------+--------------+-----------+-----------------------------------+ 
| menuId | menuNome  | menuIdPai | menuLink       | 
+--------+--------------+-----------+-----------------------------------+ 
|  5 | Produtos  |   0 | produtos.php      | 
|  6 | Informática |   5 | categoria.php?cat=informatica  | 
|  9 | Televisão |   5 | categoria.php?cat=televisao  | 
|  10 | Computadores |   6 | subcategoria.php?sub=computadores | 
|  11 | Monitores |   6 | subcategoria.php?sub=monitores | 
+--------+--------------+-----------+-----------------------------------+ 
5 rows in set (0.00 sec) 

mais quand je supprimer:

mysql> delete from menu where menuId = 5 or menuIdPai in((select menuId from menu where menuIdPai = 5 or menuId = 5)); 
ERROR 1093 (HY000): You can't specify target table 'menu' for update in FROM clause 

Comment puis-je supprimer des données de la table, ils sont retournés dans le select?

+0

Le lien suivant est pour une requête de mise à jour, mais vous pouvez le modifier trivialement pour le supprimer: http://stackoverflow.com/questions/4268416/sql-update-with-sub-query-that-references-the-same -table-in-mysql –

Répondre

1

Malheureusement, MySQL ne prend pas en charge les commandes SELECT dans les instructions UPDATE ou DELETE provenant des mêmes tables. http://dev.mysql.com/doc/refman/5.6/en/delete.html "Actuellement, vous ne pouvez pas supprimer d'une table et sélectionner dans la même table dans une sous-requête." Par conséquent, vous devrez utiliser des jointures pour cela.

+0

J'essaie ceci: sélectionnez * dans le menu m gauche rejoindre le menu enfants sur children.menuId = m.menuIdPai où children.menuId n'est pas null et children.menuId = 5 ou children.menuIdPai = 5 mais pas suppression de l'ID de menu de m (père) –

+0

Résolu .. delete m, les enfants du menu m à gauche rejoignent le menu enfants sur children.menuId = m.menuIdPai où children.menuId n'est pas nul et children.menuId = 5 ou enfants. menuIdPai = 5 ou m.menuId = 5 Merci pour r conseil. –

+0

Pas de problème! Content que ça se soit bien passé. C'est un peu stupide que MySQL ne vous autorise pas à le faire. Il semble plus lisible quand c'est dans une sous-requête. – TIHan