2011-05-05 3 views
2

이것이 가능한지 확실하지 않습니다. 하지만 여기서 전문가와 확인하고 싶었습니다.MySQL - 기본 테이블과 테이블을 두 번 결합하십시오

내 경우는 다음과 같습니다 나는 기본적으로 캠페인 동안 선택한 사용자가 캠페인 ID (tbl_campagin_user와 함께 저장되는 테이블이라고 tbl_campaign_user 많은 관계로 하나가있는 캠페인을 저장하는 테이블 tbl_campaign 있습니다. cu_campaign_id = tbl_campaign.campaign_id).

두 번째 테이블 (tbl_campaign_user)에는 보내지 않은/보낸 것을 나타내는 0/1 상태 필드가 있습니다. 캠페인 데이터와 보낸 사람과 보내지 않은 캠페인 사용자의 수를 읽는 단일 SQL 쿼리를 작성하려고했습니다. (이것이 두 번째 테이블에 두 번 가입하는 이유입니다.) 아래에서 이것을 시도했지만 송수신 횟수와 동일한 숫자를 얻습니다. =>

SELECT `tbl_campaign`.*, 

COUNT(unsent.cu_id) as num_unsent FROM (`tbl_campaign`) 

Left join tbl_campaign_user as unsent on (unsent.cu_campaign_id = tbl_campaign.campaign_id and unsent.cu_status='0') 

WHERE `tbl_campaign`.`campaign_id` = '19' 

정확히 같은 원 위의 작품 :

SELECT `tbl_campaign`.*, 
COUNT(sent.cu_id) as numsent, 
COUNT(unsent.cu_id) as num_unsent FROM (`tbl_campaign`) 

LEFT JOIN tbl_campaign_user as sent on (sent.cu_campaign_id = tbl_campaign.campaign_id and sent.cu_status='1') 

LEFT JOIN tbl_campaign_user as unsent on (unsent.cu_campaign_id = tbl_campaign.campaign_id and unsent.cu_status='0') 


WHERE `tbl_campaign`.`campaign_id` = '19' 

나는 두 부분으로 쿼리를 파괴함으로써 디버깅을 시도했다. 나는 두 가지를 병합하는 동안 내가 잘못 뭘했는지 확실하지 않다

=>

SELECT `tbl_campaign`.*, 
COUNT(sent.cu_id) as numsent FROM (`tbl_campaign`) 

Left join tbl_campaign_user as sent on (sent.cu_campaign_id = tbl_campaign.campaign_id and sent.cu_status='1') 

WHERE `tbl_campaign`.`campaign_id` = '19' 

: 그래서 아래와 않습니다. 나는 조인에 대해 많이 모른다는 것을 알기 때문에 개념적 오류가있을 수 있습니까? 누구든지 나를 도울 수 있습니까?

미리 Thx!

답변

2

tbl_campaign_user 한 번만 입력하면됩니다. 은 cu_status가 0/1이었던 횟수를 (합계, 무엇이든) 계산합니다.

이 의사 코드의 일종이다
SELECT `tbl_campaign`.id, 
count(u.id) as num_all_campaign_users 
sum(u.cu_status) as num_sentcampaign_users, 
count(u.id) - sum(u.cu_status) as num_unsent_campaign_users 
FROM `tbl_campaign` c 
LEFT JOIN tbl_campaign_user as u on (u.cu_campaign_id = c.campaign_id) 
WHERE `tbl_campaign`.`campaign_id` = '19' 
group by `tbl_campaign`.id 

주, 당신은/ 에게 합계 정교한뿐만 아니라 by 절 select 절 및 그룹에 계산 할 수 있습니다.

+0

안녕하세요 bpgergo, 빠른 답장을 보내 주셔서 감사합니다. 그룹을 tbl_campaign.campaign_id (으)로 변경하고 unsent.cu 대신에 ON 조건을 user.cu_campaign_id로 수정했습니다 ... (나는 당신이 오타 였지만 비슷한 경우 계기). 그러나 내가 찾고있는 것은 조인에 대한 상대적인 통찰력입니다. 내 테이블에 SUM이 가능하지 않은 cu_status가 없으면 어떻게해야합니까? 나는 그것에 대한 더 많은 도움을 원합니다 :) – zarun

+0

Append :: LEFT JOINing 경우 두 개의 하위 쿼리가 유일한 옵션일까요? – zarun

+0

tbl_campaign_user.cu_status 필드에 0과 문자 플래그 중 가능한 값이 없으면 합계는 다음과 같습니다 :'sum (if (cu_status = 'S', 1, 0))'mysql [if ] (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if). 이 경우, SUM은 친구입니다. 원하는 경우에 1을주고 다른 모든 것에 대해 0을 얻은 다음 SUM을 사용하여 원하는 경우를 계산하는 함수를 찾아야합니다. 도움이되기를 바랍니다. – bpgergo

관련 문제