2013-07-22 3 views
0

나는 카테고리와 페이지 테이블을 가지고 있습니다. 내 테이블 구조가이 같은입니다 : 하나 하나가 네MySQL Join Subcategory

id | is_parent | parent | name 
1  1   NULL example 
2  0   1  subexample 

을 세 개의 열

id | category_id | content 
1   2  example page of subexample 
2   1  example page of example 

카테고리를 가지고있다

페이지 나 해당 카테고리의 모든 페이지를 얻으려면 부모의 경우 , 하위 범주의 구성원 인 페이지도 포함하고 싶습니다.

예를 들어, 사용자가 예제 카테고리의 전체 내용을보기로 선택한 경우, 나는 하위 예제의 예제 페이지와 예제 페이지를보고 싶습니다.

$query = "SELECT * FROM `pages` WHERE `category_id` = :cid 
union 
select * from `pages` p 
join `categories` k ON k.id = p.category_id 
where k.parent = :cid"; 

나는 위의 코드를 시도했지만 저를 위해 일하지 않았습니다. 나는 내 논리로도 확신하지 못한다.

답변

0

당신은

SELECT * 
    FROM pages 
WHERE category_id IN 
(
    SELECT c.id 
    FROM categories c LEFT JOIN categories p 
     ON c.parent = p.id 
    WHERE p.id = :cid OR c.id = :cid 
) 

또는 여기

SELECT * 
    FROM pages p 
WHERE category_id IN 
(
    SELECT :cid 
    UNION ALL 
    SELECT id 
    FROM categories 
    WHERE parent = :cid 
) 

이 시도 할 수 SQLFiddle 데모

참고 : 그것은 단지 한 단계 깊은 의미 범주에 대해 작동합니다 및 그 하위 카테고리 만. 하위 카테고리에 다른 하위 카테고리가 있으면 동적 SQL을 사용하여 카테고리 트리를 탐색해야합니다.

+0

대단히 감사합니다. –

0
SELECT pages.* FROM pages,categories 
WHERE pages.category_id=categories.id 
    AND (categories.id=:cid OR parent=:cid)