繁体   English   中英

在MySQL中,如何编写SQL来比子查询更好地联接两个表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM