2014-02-14 6 views
1

내가 말하길 두 개의 MySQL 테이블 인 purchase_log는 모든 클라이언트 지불의 기록이고, game_log는 재생 된 모든 게임의 기록입니다.MySQL에서 하위 쿼리보다 두 테이블을 결합하는 SQL 작성 방법은 무엇입니까?

create table purchase_log (
    client_id int, 
    purchase_date date, 
    amount int 
); 

insert into purchase_log (client_id, purchase_date, amount) values (9, '2012-01-01', 10); 
insert into purchase_log (client_id, purchase_date, amount) values (10, '2012-01-01', 5); 
insert into purchase_log (client_id, purchase_date, amount) values (11, '2012-01-01', 10); 

create table game_log (
    client_id int, 
    game_id int, 
    game_date date 
); 

insert into game_log (client_id, game_id, game_date) values (9, 110, '2012-12-01'); 
insert into game_log (client_id, game_id, game_date) values (10, 110, '2012-12-01'); 
insert into game_log (client_id, game_id, game_date) values (11, 110, '2012-12-01'); 
insert into game_log (client_id, game_id, game_date) values (11, 110, '2012-12-02'); 
insert into game_log (client_id, game_id, game_date) values (11, 110, '2012-12-03'); 


월별로 그룹화 클라이언트가 평균 지출 금액은 있지만 게임을 재생 고객을위한, 무엇입니까?

select avg(amount) 
from purchase_log 
where client_id in 
      (select client_id 
      from game_log 
      #where... 
      ) 
#and... 
group by month(purchase_date); 

+-------------+ 
| avg(amount) | 
+-------------+ 
|  8.3333 | 
+-------------+ 

이 답변은 8.3입니다. ((10 + 10 + 5 = 8.3)/3) 기사는 말을하지만 많은 SO 조인 더 효율적이다, 그래서 가입으로 재 작성 :

select avg(amount) 
from purchase_log p 
#where... 
join game_log g on p.client_id=g.client_id 
#and... 
group by month(purchase_date); 

+-------------+ 
| avg(amount) | 
+-------------+ 
|  9.0000 | 
+-------------+ 

그러나 9.0의 결과가 잘못된 것입니다, 그것은 8.3이어야합니다. 한 클라이언트가 여러 행을 해 3 행을 제공하기 때문에 조인은 잘못된 결과를 제공합니다.

이 조인을 수정할 수있는 방법이 있습니까? 아니면 덜 효율적인 하위 쿼리로 돌아 가야합니까?

답변

2

이 쿼리를 시도하는 또 다른 방법은 다음과 같습니다이 들어

select avg(amount) 
from purchase_log pl 
where exits (select 1 
      from game_log gl 
      where gl.client_id = pl.client_id 
      ); 

당신은 또한 game_log(client_id)에 인덱스를 원하는, 잘 작동 할 수 있습니다.

join에 행 수가 곱하기 때문에 결과가 달라집니다. 이것은 where 절에 조건을 유지하는 것이 더 쉬운 경우입니다.

관련 문제