2014-03-14 2 views
0

조인 :SQL 내가 세 개의 테이블이

내가 원하는 무엇
Messages 
messageid | userid | text 
Ex: 1 | 1303 | hey guys 

Users 
userid | username 
Ex: 
1303 | trantor 
1301 | tranro1 
1302 | trantor2 

Favorites 
messageid | userid 
Ex: 
1 | 1302 
1 | 1301 

는, 사용자 이름이있는 테이블을 표시입니다, 그리고 메시지의 특정 번호를 즐겨 찾기했다가있어 배의 수를 계산 타임스. 위의 예에서 "각 사용자는 정확히 두 번 좋아하는 메시지가 몇 개나 있습니까?"라는 질문을하고 싶습니다. 하고, 천연 확장 "최소 2"로 정확히 두 번 교체하는 것입니다

trantor | 1 

말 행이있는 테이블을 보여주는 것 "이 6 개 이상"등 임 조인으로 카운트를 결합하려고 노력하고 혼란스러워. 그리고 테이블이 크기 때문에 Im은 중요하지만 내 쿼리가 올바르게 작동하고 있다고 확신하지 못합니다. 나는 this article을 읽고 여전히 혼란 스러워요 : L

내가 지금까지 무엇을 가지고 :

SELECT USERS.username, COUNT(FAVORITES.id) FROM USERS INNER JOIN FAVORITES ON FAVORITES.userID=USERS.id WHERE COUNT(FAVORITES.id) > 2; 

그러나 나는 그것이 작동하는 것 같아요.

On S.O. 'correlated subqueries'에 these questions이 있지만 완전히 혼동 스럽습니다.

이렇게 될 수 있을까요?

SELECT USERS.username, 
,  (  SELECT COUNT(FAVORTIES.userid) 
       FROM FAVORITES INNER JOIN ON MESSAGES 
       WHERE FAVORITES.messageid = MESSAGES.messageid 
     ) 
FROM USERS 

답변

0

SQL의 집계 함수에 대해 알아야 할 몇 가지 사항이 있습니다. 먼저 집계 함수를 선택하는 경우 GROUP BY을 수행해야합니다. 둘째, 집계 함수와 관련된 조건은 WHERE 대신 HAVING 절과 함께 사용해야합니다.

GROUP BY은 집계 함수와 함께 선택한 열에 적용됩니다.

SELECT attribute1, COUNT(attribute2) 
FROM someTable 
GROUP BY attribute1 
HAVING COUNT(attribute2) > 2; 

사용하면 다음과 같은 JOINSORDER BY 무엇을하지를 사용하고 다른 것을 적용 :

여기 기본 구조입니다.

참고 :이 조항이있을 필요가 특정 순서가있다 ORDER BYHAVING 후가는 등, 등 GROUP BY 후에 온다.. 내가 제대로 기억하고있어 경우

, 작업의 순서는 이동 :

SELECT 
FROM 
WHERE 
GROUP BY 
HAVING 
ORDER BY 
0

당신이보다는 HAVING과 함께 GROUP BY를 사용해야합니다 같은 COUNT()으로 집계 함수를 사용할 때 WHERE

SELECT USERS.username, COUNT(FAVORITES.id) 
FROM USERS 
INNER JOIN FAVORITES 
ON FAVORITES.userID=USERS.id 
GROUP BY USERS.username 
HAVING COUNT(FAVORITES.id) > 2; 

From documentation

GROUP BY 절이없는 명령문에서 그룹 기능을 사용하면 모든 행에 대해 그룹화하는 것과 같습니다.

관련 문제