내가 말하길 두 개의 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 행을 제공하기 때문에 조인은 잘못된 결과를 제공합니다.
이 조인을 수정할 수있는 방법이 있습니까? 아니면 덜 효율적인 하위 쿼리로 돌아 가야합니까?