2013-03-19 2 views
3

방금 ​​코드베이스를 상속 받았으며 올바르지 않은 기존 쿼리가 있습니다. 아무도 그것을 잠시 동안 잘못 눈치 없다는 것을 너무 가까이Mysql - 하나의 쿼리에서 2 카운트, 잘못된 두 번째 카운트 결과

select p.user_id, p.photo_id, p.date, count(p.photo_id) as 'Photos', count(v.photo_id) as 'Views' 
from photos p 
LEFT OUTER JOIN userviews v on v.user_id = p.user_id and v.photo_id = p.photo_id 
where p.photo_id in (1,2,3 [...]) 
GROUP BY photo_id, user_id 
ORDER BY user_id, photo_id 

결과 세트가 가까이 해결하려면 : 그것은 (& 열 여기가 genericized 테이블)처럼 보인다.

표 2 (사용자보기)에 데이터가없는 경우 결과 행이 올바른 것입니다. 지금

1082 3381 2012-05-25 08:50:20 3 3 <--WRONG, should be 1 
1082 3387 2012-07-26 15:02:36 2 2 <--WRONG, should be 4 
1117 3381 2012-05-23 03:46:02 1 0 <--CORRECT 
1117 3382 2012-05-23 03:45:54 1 0 <--CORRECT 
1117 3383 2012-05-23 03:45:09 1 0 <--CORRECT 

을이 SQL 서버 인 경우에, 난 그냥를 사용 망할 일을 다시 것 : 데이터가있는 경우

그러나, 결과 집합 즉, 표 1에서 카운트 값을 복제한다 CTE가 있지만, MySQL은 WITH 절을 지원하지 않으며 여러 값을 반환 할 때 하위 쿼리를 작성할 수 있다고 생각하지 않습니다.

그래서 어떻게 이것을 MySQL에서 해결할 수 있습니까? 사전에 감사드립니다, 나는이 하나에 난처 해 해요.

+1

집계되지 않은 샘플 데이터를 게시 할 수 있습니까? – Rachcha

답변

1

당신이하지 GROUP BY를 수행 할 때

SELECT p.user_id, p.photo_id, p.Photos, ph.date, v.Views 
FROM photos ph, 
     (SELECT p.user_id, p.photo_id, count(p.photo_id) as 'Photos' 
     FROM photos p 
     WHERE p.photo_id in (1,2,3 [...]) 
     GROUP BY p.photo_id, p.user_id) p, 
    (SELECT v.user_id, v.photo_id, count(v.photo_id) as 'Views' 
     FROM userviews v 
     WHERE v.photo_id in (1,2,3 [...]) 
     GROUP BY v.photo_id, v.user_id 
    ) v 
WHERE p.user_id = v.user_id AND 
     p.photo_id = v.photo_id AND 
     ph.photo_id = p.photo_id AND 
     ph.user_id = p.user_id 
ORDER BY p.user_id, p.photo_id 

편집이

SELECT p.user_id, p.photo_id, p.Photos, ph.date, v.Views 
FROM (SELECT v.user_id, v.photo_id, count(v.photo_id) as 'Views' 
     FROM userviews v 
     WHERE v.photo_id in (1,2,3 [...]) 
     GROUP BY v.photo_id, v.user_id 
    ) v left join (SELECT p.user_id, p.photo_id, count(p.photo_id) as 'Photos' 
     FROM photos p 
     WHERE p.photo_id in (1,2,3 [...]) 
     GROUP BY p.photo_id, p.user_id) p  
ON p.user_id = v.user_id AND p.photo_id = v.photo_id 
     left join photos ph 
On ph.photo_id = p.photo_id AND 
     ph.user_id = p.user_id 
ORDER BY p.user_id, p.photo_id 

가입 왼쪽 사용하여이 쿼리를 시도하거나 SELECT 목록에있는 모든 항목을 집계, MySQL은 다른 열 값을 선택하고 예상치 못한 결과가 발생할 수 있습니다. (REFER) 잘못된 결과가 나왔던 이유

+0

불행히도, 이것은 첫 번째 레코드 인 1 행만 반환합니다. –

+1

편집을 확인하십시오. 두 번째 쿼리의 테이블 이름에서 실수를했습니다. – Meherzad

+0

좋아요, 더 가깝습니다 ... 유일한 문제는 where 절이 너무 제한적이므로 내부 조인을 시뮬레이트하고 있습니다. 왼쪽이 필요합니다. 밖의. 결과 세트가 '1082'에서 '1612'로 점프하고, 사진 및보기가 제대로없는 사용자 '1117'은 건너 뜁니다. –