2013-10-09 2 views
0

아무에게도 설명 할 수 없으므로이 mysql 쿼리가 'on clause'의 "Unknown column 'n.Id'오류를 발생시키는 이유는 무엇입니까? 그것은 정말로 나에게 어떤 의미가 없습니다.왼쪽 조인을 사용하여 mySQL의 중첩 세트

SELECT n.Id, 
     n.Name, 
     COUNT(*)-1 AS level, 
     seo.URLName 
FROM NestedSetsTable AS n, 
    NestedSetsTable AS p 
LEFT JOIN SEO__Table AS seo 
ON seo.ElementId = n.Id 
AND seo.ElementCat = 1 
WHERE n.lft BETWEEN p.lft AND n.rgt 
GROUP BY n.lft 
ORDER BY n.lft 

기본적 NestedSetsTable는 열 이드, 이름, LFT, RGT하고서야 테이블합니다 (Categorie의 ID를 포함)를 elementId로부터를 가지고 있고,이 경우에는 INT 1을 포함 ElementCat (범주에 대해, (2)는 예를 들어 제품) 것, 예를 들어 example.com/Categories/myCleanName)

편집 주셔서 감사합니다 깨끗한 URL의 이름을 포함 URLName의 (:. 나는이 문제를 해결하지만, 어쨌든 부탁하는 이유는 왜 n.Id가 ON 절에서 알 수 없는지를 알아 내고 싶기 때문입니다. 오 감각.

+0

나는 긍정적 아니지만, 내가 당신 때문에이었다 생각해야 할 것입니다 ANSI 조인 스타일과 theta 스타일을 결합했습니다. 어떻게 그걸 고쳤습니까? – AgRizzo

+0

I는이 같은 URLName의 부속 선택하여 간단히 고정 : SELECT n.Id, n.Name, COUNT (*) - AS 레벨 1을 (SEO AS SEO__Table FROM seo.URLName을 선택 WHERE seo.ElementId = N .Id AND ElementCat = 1) AS URLName FROM ... – Fitzi

답변

1

조인 구문이 잘못되었습니다. NestedSetsTable에 대한 두 참조를 어떻게 조인 할 것인지 잘 모르겠습니다. 그래서 지금은 ID에 대한 내부 조인이라고 가정합니다. 또한, MySQL이 그룹핑을 처리하는 방법을 기억하지는 않지만 일반적으로 쿼리의 비 집계 컬럼을 모두 그룹화해야합니다. n.Id, n.Name, seo.URLName

SELECT n.Id, 
     n.Name, 
     COUNT(*)-1 AS level, 
     seo.URLName 
FROM NestedSetsTable AS n 
CROSS JOIN NestedSetsTable AS p 
LEFT JOIN SEO__Table AS seo 
ON seo.ElementId = n.Id 
AND seo.ElementCat = 1 
WHERE n.lft BETWEEN p.lft AND n.rgt 
GROUP BY n.lft 
ORDER BY n.lft 
+0

내가 조인 구문이 좋아야한다고 생각합니다. 특히 p.Id에 대해 n.Id를 전환하면 모든 카테고리의 올바른 출력이 나오기 때문에 특히 그렇습니다. 레벨의 경우, URLName은 각 카테고리의 최상위 부모 중 하나입니다. 이 중첩 된 집합의 튜토리얼에서 기본 쿼리를 받았습니다 (http://www.klempert.de/nested_sets/#kap3 (독일인)) 예제에서 레벨은 항상 0이므로 어울리다. – Fitzi

+0

@Fitzi 참조한 예제의 조인은 n과 p의 조인이므로이를 기반으로 예제를 업데이트 할 수 있습니다. –

+0

네, 크로스 조인이 작동하지만 수준이 올바르지 않습니다 (각 행이 카운트됩니다). 그리고 select에서 subselect를 사용하여이 문제를 이미 해결했지만, 실제로 알고 싶습니다. 왜 위의 예에서 알 수없는 것입니까? – Fitzi

-1

이동 기준은 WHERE 절에 AND seo.ElementCat = 1 : ....

LEFT JOIN SEO__Table AS seo ON seo.ElementId = n.Id WHERE n.lft BETWEEN p.lft AND n.rgt AND seo.ElementCat = 1 

...

+0

"unknown column"에 영향을 미치지 않습니다. on 절에 있습니다. – Fitzi

+0

일부 SQL 환경에서는 구문이 상태를 조인 할 때 오해의 소지가있는 오류 메시지를 표시하지만 정의하지 않았기 때문에 조인을 구문 분석 할 수 없습니다 두 조인은 조인을 수행합니다. "= 1"은 정의 된 열이 아닙니다. 하지만 투표율이 낮은 친구를 주셔서 감사합니다! lol –

+0

죄송하지만 문법이 옳습니다. Brian Driscoll이 내 문제가 해결되지 않은 이유를 설명했습니다. (그의 대답의 주석을 보라) – Fitzi

관련 문제