2013-04-02 2 views
3

나는이 테이블 데이터를 가지고있다. 기본적으로 장소 이름과 같은 테이블에이 속한 다른 장소 인 으로 구성됩니다. 필드 belongs_to은 다른 장소의 id을 나타냅니다. 내가 "싸이"를 입력 할 때 잘 작동루프하는 방법 JOIN

  SELECT A.type, 
       A.name_en AS name_A, 
       B.name_en AS name_B, 
       C.name_en AS name_C 

       FROM address AS A 
       LEFT JOIN address AS B ON A.belongs_to = B.id 
       LEFT JOIN address AS C ON B.belongs_to = C.id 
       WHERE A.name_en LIKE '%".$_GET['name']."%' 
       " 

그것은 나를 가져옵니다 :

[type] = city 
[name_A] =sydney 
[name_B] =NSW 
[name_C] =australia 

을 그러나 나는 "켄을 입력 할 때 다음

enter image description here

은 내가 사용하고있는 쿼리입니다 "날 가져옵니다.

[type] =suburb 
[name_A] = kensington 
[name_B] =sydney 
[name_C] = NSW 

호주를 그리워합니다. 유연하게 만들고 싶습니다. 모든 데이터를 type_order1 또는 belongs_to 인 국가 이름으로 바꾸려면 0입니다. 나는 루핑 기술을 찾으려고 노력 해왔고 좋은 참고 자료를 찾을 수 없었다. 말해 주길 원한다면 또 다른 제안을 해 주시거나 저의 솔루션이 맞다고 생각하시는 지 확인해 주시거나 반복 루핑을 도와 주시거나 MySQL 루핑과 관련된 좋은 참고 자료를 찾으십시오.

+0

SQL에서이 작업을 수행해야합니까? 나는 이것이 "belongs_to"가 0이 될 때까지 "Loop Through"라고 말할 수있는 응용 프로그램 로직에서 더 잘 수행 될 것이라고 생각합니다. – PaulProgrammer

+0

나는 이것이 가능한 방법을 보지 못한다! – Sami

+0

PHP에서 [mysql_ *] (http://www.php.net/manual/en/function.mysql-connect.php) 기능을 사용하는 경우 [PDO] (http://php.net/)를 사용하십시오. manual/en/book.pdo.php) – shnisaka

답변

0

당신이 링크 된 데이터가 너무 "인접성 (adjacency) 목록"이라고 유지하기 위해 선택하는 방법을 도움이 될 것입니다. 일반적으로 랜덤 깊이 A.L.을 "반복"할 수있는 방법은 없습니다. 'kensington'에서 'australia'까지의 항목을 보려면 쿼리에 하나 이상의 조인이 필요합니다. 추가 행마다 조인을 하나씩 추가해야합니다.

"중첩 목록"및 "구체화 된 경로"와 같은 대체 기술을 찾으십시오. 또는 PHP의 루프를 사용하여 인접 목록 항목을 반복합니다.

3

사용자 조인에 문제가 없습니다. 조건은 기본적으로 귀하의 WHERE 상태에 따라 다릅니다. 테이블의 구조를 제공하거나이를 시도 할 수 있습니다하십시오 :

SELECT A.type, 
       A.name_en AS name_A, 
       B.name_en AS name_B, 
       C.name_en AS name_C 

       FROM address AS A 
       LEFT JOIN address AS B ON A.belongs_to = B.id 
       LEFT JOIN address AS C ON B.belongs_to = C.id 
       WHERE A.name_en LIKE '%".$_GET['name']."%' or A.id=1 
+0

이것은 3 개의 'name_en'까지만 덮고 있고 분기하는 지점에 유연하지 않다는 것입니다. 때로는 'LEFT JOIN (LEFT JOIN)'을 네 번 이상 국가 이름에 가야합니다. – Sami

0
SELECT A.name_en AS name_A, NULL AS TYPE  

FROM tablename1 AS A 
LEFT JOIN tablename1 AS B ON A.belongs_to = B.id     
WHERE A.name_en LIKE '%ken%' OR A.belongs_to = B.id OR A.belongs_to = 0 

UNION ALL 

SELECT NULL AS name_A, C.type 
FROM tablename1 AS C 
WHERE c.name_en LIKE '%ken%' 

희망이 당신

+0

나는 그것을 시험해 보았다. 그리고 그것은 나라 이름에 나를 붙 잡지 않았다. – Sami

관련 문제