2012-08-01 2 views
1

현재 사용자가 타임 스탬프를 기준으로 방문수를 얻고 있지만 총 방문수도 포함하고 싶습니다. 이것은 하나의 MySQL 구문으로 가능합니까?mysql에서 조건문 where 문을 사용하여 두 번 계산할 수 있습니까?

$sql = "SELECT count(*) as visitors_count FROM profile_visits 
     LEFT JOIN users on users.user_id=profile_visits.user_id 
     LEFT JOIN profile_info ON profile_info.user_id = users.user_id 
     WHERE profile_user_id=5 
     AND users.restricted <> 1 
     AND profile_visits.visit_time > '2012-07-30 18:53:16'"; 

가 나는 또한 타임 스탬프를 제외 방문의 총 수를 반환 할 수 있습니다 여기에 타임 스탬프를 기반으로 하나의 수를 반환 내 현재 쿼리는?

+0

'총 방문수도 포함하고 싶습니다.' –

+0

총계 수에 대한 타임 스탬프 제한을 제외하고 싶습니다. – Paul

답변

2

당신은 COUNT()CASE 표현 조건부 집계를 사용할 수 있습니다

SELECT COUNT(*) AS total_count, 
      COUNT(CASE WHEN profile_visits.visit_time > '2012-07-30 18:53:16' THEN 1 END) AS visitors_count 
FROM  profile_visits 
LEFT JOIN users ON users.user_id=profile_visits.user_id 
LEFT JOIN profile_info ON profile_info.user_id = users.user_id 
WHERE  profile_user_id=5 AND 
      users.restricted <> 1 

나는 단순히 그 기준에 부합하는 경우에만 행을 계산 할 COUNT()CASE 표현에 WHERE 절에서 > '2012-07-30 18:53:16'을 움직였다. 물론 COUNT(*)은 타임 스탬프에 관계없이 모든 행을 계산합니다.

+0

그게 효과가있었습니다 ... 저는 CASE 표현을 사용하거나 들어 본 적이 한번도 없습니다. 감사! – Paul

+0

COUNT 대신 SUM을 사용해야한다고 생각합니다! 그리고 간단한 IF 문이 훨씬 더 예쁘다. – Mehran

+0

@MehranZiadloo, 그 이유를 설명해 주시겠습니까? 'COUNT()'를 사용하면 *** 행을 세고 있음을 독자에게 분명히 알릴 수 있습니다. 우리는 아무것도 합하지 않습니다. 또한 CASE 표현식은 DBMS와 관련이 없으므로 SQLServer, Oracle, PGSQL 등 모든 주요 DBMS에서 작동합니다. IF()는 MySQL에만 해당됩니다. 그래서'COUNT() '를 사용하면 명령문의 명확성이 좋아지며'CASE'는 DBMS 추상화에 이점이 있습니다. 자세한 내용은 [이 질문] (http://stackoverflow.com/questions/11340540/conditional-counting-performance-differences-in-using-sum-vs-count)을 참조하십시오. –

관련 문제