2014-11-27 4 views
0

SQL 쿼리를 사용하여 주어진 월에 5보다 큰 페이지 뷰를 가진 사용자 수를 찾으려고합니다.그룹과 함께 where 절에 별칭 사용

적어도 5 페이지 뷰의 조건을 추가 할 수 없다는 점을 제외하고는 지금까지 내가 정확히 무엇을 말하고 있는지를 제외하고는 위와 같습니다. 현재 지정된 달에 최소 1 회의 페이지 뷰를 보유한 사용자의 수를 보여줍니다.

SELECT CONCAT(MONTH(analytics.date),'/',YEAR(analytics.date)) AS DATE, 
     COUNT(analytics.id) AS views, 
     COUNT(DISTINCT users.id) AS num_users 
FROM users 
    LEFT JOIN analytics ON users.id = analytics.user_id 
WHERE users.banned = 0 
     AND analytics.id IS NOT NULL 
GROUP BY YEAR(analytics.date), MONTH(analytics.date) 

나는 where 절에 AND views > 5을 추가하는 시도하지만 알 수없는 열을받을대로 그 작동하지 않았다.

HAVING 절은 GROUP BY 이후에 적용되므로 5 페이지 뷰 이상인 개별 사용자를 찾아야한다고 생각하지 않습니다.

어떻게 그럴 수 있습니까?

+0

한 달에 5 번 또는 전체적으로 5 번 조회? –

+0

@ GordonLinoff 사용자는 적어도 5 페이지 뷰를 가져야 만합니다. 그런 다음 해당 달 동안이 모든 사용자의 수가 필요합니다. – Abs

+0

** ** HAVING 절이 필요합니다. 사용자 ID가 필요한 경우 SELECT 및 GROUP BY 절에 추가해야합니다. –

답변

1

사용자가 GROUP BY에 들어가는 사용자를 선택하기 때문에 하위 쿼리를 사용해야합니다. 여기서 사용자가테이블에 5 개 이상의 항목이있는 경우 각 행을 묻는 하위 쿼리를 WHERE 절에서 수행합니다. 당신이 특정 달에 사용자 개 이상의 조회 수있을하려면

SELECT CONCAT(MONTH(analytics.date),'/',YEAR(analytics.date)) AS DATE, 
COUNT(analytics.id) AS views, 
COUNT(DISTINCT users.id) AS num_users 
FROM users 
LEFT JOIN analytics ON users.id = analytics.user_id 
WHERE users.banned = 0 
    AND (SELECT COUNT(*) FROM analytics AS a WHERE a.user_id = users.id) > 5 
AND analytics.id IS NOT NULL 
GROUP BY YEAR(analytics.date), MONTH(analytics.date) 

, 다음 쿼리를 수정해야하고 내부를 사용해야합니다 가입 :

SELECT CONCAT(MONTH(analytics.date),'/',YEAR(analytics.date)) AS DATE, 
COUNT(analytics.id) AS views, 
COUNT(DISTINCT users.id) AS num_users 
FROM users 
JOIN analytics ON users.id = analytics.user_id 
WHERE users.banned = 0 
    AND (SELECT COUNT(*) FROM analytics AS a WHERE a.user_id = users.id AND EXTRACT(YEAR_MONTH FROM a.date) = EXTRACT(YEAR_MONTH FROM analytics.date)) > 5 
AND analytics.id IS NOT NULL 
GROUP BY YEAR(analytics.date), MONTH(analytics.date) 
+0

하지만보기> 5에 대한 필터는 어디에 있습니까? – HaveNoDisplayName

+0

@Piyush : 원래'> 0'으로 읽었습니다. 내부 조인 물건을 제거하겠습니다. 하위 쿼리 부분 여전히 잘 작동합니다. – siride

+0

처음 답장을 해 주신 이래로이 질문에 답변 해 주셨습니다. 귀하와 고든 모두 저에게 맞는 답변을 가지고 계셨습니다. 쿼리가 느립니다. :-) – Abs

2

이것이 요구 사항이라면 사용자 수준에서 한 번, 분석 수준에서 두 번째로 집계해야합니다. 또는 where 절에 하위 쿼리를 사용하십시오. 다음은 필요한 것입니다.

SELECT CONCAT(MONTH(a.date),'/',YEAR(a.date)) AS DATE, 
     COUNT(a.id) AS views, 
     COUNT(DISTINCT u.id) AS num_users 
FROM users u LEFT JOIN 
    analytics a 
    ON u.id = a.user_id 
WHERE u.banned = 0 AND a.id IS NOT NULL AND 
     5 <= (SELECT COUNT(*) FROM analytics a2 WHERE a2.user_id = u.userid) 
GROUP BY YEAR(a.date), MONTH(a.date); 

여기에는 제한에 대한 전체 개수가 사용됩니다.

편집 : 하위 쿼리 속도를 높이려면 analytis(user_id, date)에 대한 인덱스가 있어야합니다.

+0

하위 쿼리에서 다른 조건을 포함해야한다고 생각합니다.이 수가 모든 시간이 아닌보기의 수를 제한합니다. 'AND MONTH (a.date) = MONTH (a2.date)', 지금 테스트 해 보면 혼란스러워집니다! – Abs

+0

@Abs : 당신은 질문에 대한 논평에서 항상 ... – siride

+0

@Abs. . . 한도가 한달에 5 번이면 그 조건을 하위 쿼리에 포함시켜야합니다. 모든 시간 동안 제한이 5 회라면 논리를 포함 할 필요가 없습니다. –