2010-02-15 9 views
0

저는 SQL에 익숙하지 않아이 쿼리를 올바르게 구성하는 방법을 모르겠습니다.이 SQL 구문의 도움말 QUERY

Select comment.text, (COUNT(parent.id)-1) AS depth 
             FROM comments AS comment, 
              comments AS parent 
             WHERE comment.lft BETWEEN parent.lft AND 
parent.rght LEFT JOIN users as user ON (comment.user_id = user.id) 
              GROUP BY comment.id ORDER BY comment.lft 

MySQL 데이터베이스에 저장된 중첩 된 사용자 주석을 검색하려고합니다. 각 주석과 함께 JOIN을 사용하여 주석의 연관된 사용자를 검색하려고 시도하지만이 구문에 대해 구문이 무엇인지 확신 할 수 없습니다.

답변

1

WHERE 절 뒤에 조인을 사용할 수 없습니다. 대신 다음을 시도해보십시오.

SELECT comment.text, (COUNT(parent.id)-1) AS depth 
FROM comments AS comment 
JOIN comments AS parent 
    ON comment.lft BETWEEN parent.lft AND parent.rght 
LEFT JOIN users as user 
    ON comment.user_id = user.id 
GROUP BY comment.id ORDER BY comment.lft 

또한 댓글을 게시 한 사용자의 사용자 이름을 선택하기 위해 user 테이블에 가입했을 가능성이 있습니까? 그런 다음 해당 열을 선택해야합니다. 당신의 선택 성명에서 별도의 컬럼으로 user.username 추가하고이 같은 결과를 얻을 것이다 :이 테스트에 사용

'ELECTRONICS', 0, 'Foo' 
'TELEVISIONS', 1, 'Foo' 
'TUBE', 2, 'Foo' 
'LCD', 2, 'Bar' 
'PLASMA', 2, 'Foo' 
'PORTABLE ELECTRONICS', 1, 'Bar' 
'MP3 PLAYERS', 2, 'Foo' 
'FLASH', 3, 'Foo' 
'CD PLAYERS', 2, 'Foo' 
'2 WAY RADIOS', 2, 'Foo' 

테스트 데이터 (here에서 수정) :

CREATE TABLE comments (id INT NOT NULL, user_id INT NOT NULL, text NVARCHAR(100) NOT NULL, lft INT NOT NULL, rght INT NOT NULL); 
INSERT INTO comments (id, user_id, text, lft, rght) VALUES 
(1, 1, 'ELECTRONICS', 1, 20), 
(2, 1, 'TELEVISIONS', 2, 9), 
(3, 1, 'TUBE', 3, 4), 
(4, 2, 'LCD', 5, 6), 
(5, 1, 'PLASMA', 7, 8), 
(6, 2, 'PORTABLE ELECTRONICS', 10, 19), 
(7, 1, 'MP3 PLAYERS', 11, 14), 
(8, 1, 'FLASH', 12, 13), 
(9, 1, 'CD PLAYERS', 15, 16), 
(10, 1, '2 WAY RADIOS', 17, 18); 

CREATE TABLE Users (id INT NOT NULL, username NVARCHAR(100) NOT NULL); 
INSERT INTO Users (id, username) VALUES 
(1, 'Foo'), 
(2, 'Bar');