[英]In MySQL how to write SQL to join two tables better than a subquery?
可以说我有两个MySQL表,purchase_log(记录所有客户付款)和game_log(记录所有玩过的游戏)。
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)/ 3 = 8.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行。
有什么办法可以修复此联接? 还是应该返回效率较低的子查询?
尝试此查询的另一种方法是:
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)
上game_log(client_id)
索引。
因为你的结果是不同的join
成倍的行数。 在这种情况下,将条件保留在where
子句中确实很容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.