2012-09-11 3 views
2

올림픽 데이터베이스가 있으므로 기본 레이아웃에는 competitornum, givenname 및 familyname이있는 경쟁 업체 테이블이 있습니다 (다른 열은이 경우 필요하지 않음) competitornum 및 place가있는 결과 테이블도 있습니다. (1에서 8 사이).SQL의 하위 쿼리

나는 givenName과 및 familyname과 금,은 총 수, 동메달 얻으려고 (장소 = 1, 2 또는 3)

다음

는 내가 지금까지있어 무엇 :

SELECT c.Givenname, c.Familyname, places AS TotalPlaces 
FROM Competitors c, 
     (SELECT COUNT(*) as places 
     FROM Results r, Competitors c 
     WHERE r.Competitornum = c.Competitornum 
     AND r.Place > 0 
     AND r.Place < 4) q 

그러나 모든 사람의 이름과 동일한 총 장소 (78이됩니다)를 반환합니다. 예 :

John Smith 78 
Cassandra Jane 78 
Bob Turner 78 

답변

1

현재 귀하의 검색어는 지주 제품을 생산하는 CROSS JOIN입니다.

집계 함수 (개수, 최대, 최소, ...)를 사용할 때 레코드는 집계되지 않은 열에 의해 그룹화되어야합니다. 0과 4` 간의

SELECT c.Givenname, c.Familyname, COUNT(r.places) AS TotalPlaces 
FROM Competitors c INNER JOIN Results r 
     ON r.Competitornum = c.Competitornum 
WHERE r.place IN (1,2,3) 
GROUP BY c.Givenname, c.Familyname 
+0

'r.place이 시도 – hjpotter92

+0

@GiantofaLannister 그래서 'IN (1,2,3)'와'0 4' BETWEEN 사이의 diffrerence은 무엇? –

+0

OP가 범위를 변경하고 싶습니까? – hjpotter92