2011-09-08 3 views
0

내가 예를 들어, 부모와 이러한 기록의 자녀를 일부 데이터를 삭제해야하지만, 참조, SQL 쿼리에 문제가 다음과 같다 있습니다MySQL의 쿼리 오류

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 | 
+--------+-------------------+-----------+-----------------------------------+ 

내가 가진 쿼리 메뉴를 삭제 ID 5 내가 너희를 삭제하고자하는 데이터를, 나는 보통 결과 해요, 정상적인 선택을 할 경우 모든 자녀와 친척, 참조 :

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) 

을하지만 삭제할 때 :

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 

테이블에서 데이터를 삭제하려면 어떻게해야합니까?

+0

다음 링크는 업데이트 쿼리를위한 것이지만 삭제를 위해 쉽게 수정할 수 있습니다. http://stackoverflow.com/questions/4268416/sql-update-with-sub-query-that-references-the-same -table-in-mysql –

답변

1

불행히도 MySQL은 동일한 테이블의 UPDATE 또는 DELETE 문에서 SELECT를 지원하지 않습니다. http://dev.mysql.com/doc/refman/5.6/en/delete.html "현재 테이블에서 삭제하고 하위 쿼리의 동일한 테이블에서 선택할 수 없습니다."

이렇게하려면 조인을 사용해야합니다.

+0

나는 이것을 시도한다 : 메뉴에서 선택 * 왼쪽 결합 메뉴 children.menuId = m.menuIdPai children.menuId는 null이 아니며 children.menuId = 5 또는 children.menuIdPai = 5가 아니라 m (father)의 메뉴 아이디 삭제 –

+0

해결되었습니다. delete m, 메뉴에서 자식 m 조인 메뉴 children.menuId = m.menuIdPai 여기서 children.menuId는 null이 아니며 children.menuId = 5 또는 children입니다. menuIdPai = 5 또는 m.menuId = 5 감사합니다. 조언. –

+0

괜찮습니다. 다행이되어서 기뻐. 그것은 일종의 어리석은 MySQL은 당신이 그렇게 할 수 없습니다. 하위 쿼리에있을 때 더 읽기 쉽습니다. – TIHan