2014-09-05 2 views
2
SELECT 
       cat.CategoryID as CategoryID, 
       count(p.ProductID) as CountProducts 
      FROM 
       Category as cat 
       LEFT JOIN Products as p on p.CategoryID IN 
         (SELECT CategoryID FROM Category as cd 
          WHERE cd.ParrentCategoryID = '876') 
      WHERE 
       CategoryID = '876' 
      ORDER by Name 

"where 절이 모호한 ColumnID CategoryID '오류가 발생합니다.mysql ... where 절이 모호합니다.

내게 어떻게 될지 알려주시겠습니까?

+2

CategoryID가 두 테이블에 있습니다. 식별자 열의 이름을 테이블 이름으로 지정하는 것은 좋지 않습니다. 단지 id가 업계 표준이므로 잘 작동합니다. – Bohemian

+0

'ON' 절에서'IN (subquery)'술어를 사용하는 것은 매우 이상합니다. 일반적으로, 'ON' 절의 술어는 FROM 절의 테이블에서 열을 참조합니다. (원하는 결과 집합이 실제로 무엇인지 이해하는 데 어려움이 있습니다.) – spencer7593

답변

1

당신이 얻을 오류가 WHERE 절에 열 CategoryID 여러 CategoryID 열이 있기 때문에 시스템이 해당 열을 식별 할 수있는 문제가 있음을 의미 모호 있음을 알려줍니다보십시오. 이 문제를 해결 당신이 당신의 WHERE 절에 사용하고자하는 열을 지정 별칭을 사용하기 위해

는 :

SELECT cat2.CategoryID AS CategoryID 
    ,cat2.Name AS CategoryName 
    ,COUNT(p.ProductID) AS CountProducts 
FROM Category AS cat 
INNER JOIN Category AS cat2 ON cat2.ParrentCategoryID = cat.CategoryID 
INNER JOIN Products AS p ON p.CategoryID = cat2.CategoryID 
WHERE cat.CategoryID = '876' 
GROUP BY cat2.CategoryID, cat2.Name 
ORDER BY cat2.Name 

또한 같은 결과를 얻을 수있는 쿼리를 약간 변경되었지만 대신 사용 LEFT JOIN + IN 절 + 하위 쿼리 조합은 INNER JOIN 절을 사용했습니다. 이 쿼리를 사용하면 원하는 CategoryID을 한 번만 정의하면됩니다. 그러면 모든 하위 카테고리가 자동으로 생성됩니다. 이 당신을 도울 것입니다

난 당신이 CategoryID에 의해 결과를 그룹화하지 않고 COUNT 기능을 사용하고 있기 때문에 쿼리가 제대로 실행되는지 모르겠어요

...

희망.

+1

+1. 이것은보다 일반적인 패턴의 쿼리입니다. OP 문의와 마찬가지로 FROM 절의 테이블에있는 ON 절의 참조 열 (OP 쿼리와 마찬가지로 'IN (subquery)'과 비교 됨 – spencer7593

+0

오, 죄송합니다. 긴 밤에 작은 오류가 표시됩니다. 도움과 새로운 지식 –

+1

@learner 그걸로 뭔가를 배우면 행복합니다. 작은 오류는 개발자의 삶의 일부입니다 ;-) 질문 하나를 닫으려면 대답 중 하나를 "수락"으로 표시하는 것을 잊지 마십시오. –

0

"모호한 열"오류는 열 식별자에 대한 참조가 있고 MySQL에 사양과 일치하는 두 가지 (또는 그 이상) 가능한 열이 있음을 의미합니다. 이 특정 경우에는 WHERE 절에있는 CategoryID 열에 대한 참조입니다. CategoryID 열 (cat) 또는 CategoryID 열 (p)을 의미하는지 여부는 "모호합니다".

"수정"은 테이블 별칭 인 cat.CategoryID 또는 p.CategoryID으로 열 참조를 한정하는 것입니다.


일부 추가 참고 사항 :

그것은 ON 절에 IN (subquery) 조건이 매우 이상한. CategoryIDCategory 테이블에서 고유하지 않을 경우이 쿼리는 예상보다 많은 행을 생성합니다.

이 같은 쿼리에 대한 일반적인 패턴이 유사 뭔가 될 것이다 :

SELECT cat.CategoryID  AS CategoryID 
    , COUNT(p.ProductID) AS CountProducts 
    FROM Category cat 
    LEFT 
    JOIN Products p 
    ON p.CategoryID = cat.CategoryID 
WHERE cat.ParrentCategoryID = '876' 
ORDER BY cat.Name 

일반적으로 FROM 절에 두 개 이상의 테이블에서 ON 절 참조 열에 조인 술어. (즉, SQL 요구 사항이 아니다. 그건 그냥 일반적인 패턴입니다.) 쿼리의 ON 절에 술어가 위 지정

cat (카테고리)에서 CategoryID 열의 값 테이블 경기의 값 p (제품) 테이블의 CategoryID

또한 열을 모호하지 않은 경우에도 테이블 이름이나 테이블 별칭으로 쿼리에서 참조하도록 설정하는 것이 가장 좋습니다. 예를 들어 ORDER BY 절에있는 Name 열입니다.

이의 하나의 큰 장점은 (미래의 어떤 시점에) Name라는 이름의 열이 Products 테이블에 추가되는 경우, Name에 규정되지 않은 참조하여 쿼리 (다음)는 "모호한 열을 던져 시작하는 것입니다 "그 참조에 대한 오류. 따라서 모든 열 이름을 한정하면 새 열이 기존 테이블에 추가 될 때 작업 쿼리가 "중단"되지 않습니다.

또 다른 큰 이점은 진술의 독자에게 있습니다. MySQL은 어떤 테이블이 Name이라는 것을 알기 위해 매우 빠르게 사전을 검색 할 수 있습니다.하지만 어떤 테이블에 Name이라는 컬럼이 있는지 "알지 못하는"SQL 문을 읽는 독자는 또한 테이블 정의를 살펴볼 필요가 있습니다 찾아내는 것. 그 이름이 자격이 있다면, 우리는 이미 그 칼럼이 있던 테이블을 "알 것"입니다.

+0

나쁜 질문에 대한 사과 - 긴 밤 ... 도움을 +1 –

관련 문제