gpt4 book ai didi

mysql - 在 MySQL 中如何编写比子查询更好地连接两个表的 SQL?

转载 作者:行者123 更新时间:2023-11-29 06:40:36 25 4
gpt4 key购买 nike

假设我有两个 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 文章说 join 更有效率,所以我重写成 join:

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) 上建立索引。

您的结果不同,因为join 乘以行数。在这种情况下,将条件保留在 where 子句中确实更容易。

关于mysql - 在 MySQL 中如何编写比子查询更好地连接两个表的 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21785644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com