2009-10-18 7 views
0

내가 2 레벨 메뉴 (부모와 자녀)를 retreive하는 MySQL의 요청을 할 노력하고있어 ...MySQL의 2 수준 MENU 쿼리

단 1 표는 물론,있다 :

idCategory | Title | idCategoryParent | DisplayOrder 
1   | cat1  | NULL    | 1 
2   | sub-cat1 | 1    | 1 
3   | sub-cat2 | 1    | 2 
4   | cat2  | NULL    | 2 
5   | sub-cat3 | 4    | 1 
6   | sub-cat4 | 4    | 2 
7   | cat3  | NULL    | 3 

나는 그 결과를 찾고 있어요 : 그런

titleCat | titleSubCat | idCategory 

cat1  | sub-cat1 | 1 
cat1  | sub-cat2 | 1 
cat2  | sub-cat3 | 4 
cat2  | sub-cat4 | 4 
cat3  | NULL  | 7 

또는 뭔가를 너무 잘 될 것입니다 :

cat1  | null  | 1 
cat1  | sub-cat1 | 1 
cat1  | sub-cat2 | 1 
etc.. 
나쁜 작동하지 않습니다

SELECT subcat.title as catTitle, cat.title as parentTitle, subcat.idCategory as catIdCategory, subcat.idCategoryParent 
FROM `test_category` as cat 
RIGHT OUTER JOIN test_category as subcat ON cat.idCategory=subcat.idCategoryParent 

하지만 당신은 그것을 시도하려는 경우 여기

는 SQL 덤프의 ... 레코드를 주문하려고 고투 :

내가 좋아하는 뭔가를 시도

-- 
-- Table structure for table `test_category` 
-- 

CREATE TABLE IF NOT EXISTS `test_category` (
    `idCategory` int(11) NOT NULL AUTO_INCREMENT, 
    `idCategoryParent` int(11) DEFAULT NULL, 
    `title` varchar(20) NOT NULL, 
    `order` int(11) NOT NULL, 
    PRIMARY KEY (`idCategory`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; 

-- 
-- Dumping data for table `test_category` 
-- 

INSERT INTO `test_category` (`idCategory`, `idCategoryParent`, `title`, `order`) VALUES 
(1, NULL, 'cat1', 1), 
(2, 1, 'sub-cat1', 1), 
(3, 1, 'sub-cat2', 2), 
(4, NULL, 'cat2', 2), 
(5, 4, 'sub-cat3', 1), 
(6, 4, 'sub-cat4', 2), 
(7, NULL, 'cat3', 3); 

감사합니다. :)

답변

1

검색어가 거의 정확하지만 하위 카테고리가없는 카테고리를 원할 경우 LEFT JOIN을 사용해야하고 첫 번째 테이블에서 첫 번째 레벨 카테고리 만 선택해야합니다.

SELECT t1.title, t2.title, t1.idCategory 
FROM 
    test_category t1 
    LEFT JOIN test_category t2 ON t2.idCategoryParent=t1.idCategory 
WHERE t1.idCategoryParent IS NULL 
ORDER BY t1.DisplayOrder, t2.DisplayOrder 
+0

"DisplayOrder"로 주문해야하지만 작동하는 것처럼 보입니다! 감사! :) – mrmuggles

+0

아, 제목별로 정렬 된 것으로 보이는 예제 출력으로 가고있었습니다. –

+0

np, 나는 그것에 대해 정말로 분명하지 않았다;) – mrmuggles