几年后我重新回到 mysql 并遇到了一个问题。我有一个有效的查询,但我不知道如何更好地优化它。
这是查询:
select
u.id as 'User',
count(distinct tr.id) as Trips,
count(distinct ti.id) as 'Trip Items'
from
users u
inner join
user_emails ue on u.id = ue.user_id
inner join
trips tr on tr.user_id = u.id
inner join
trip_items ti on ti.trip_id = tr.id
where
ue.verified = true and ue.is_primary = true
and
tr.created_at between '2017-02-01 00:00:00' and '2017-02-01 00:59:59'
group by 1
having Trips < 30
我本质上需要获取所有行程和行程项目的计数..但仅适用于在给定日期范围内有 30 次或更少行程的用户。现在,我通过按用户对结果进行分组,然后执行“具有”来实现这一点。我正在查看非索引字段(created_at)上的数百万个结果。理想情况下,我只想返回 1 行,其中包含总行程和总行程项目。但在查询期间仍然应用“用户出行次数少于 30 次”。这可能吗? :)
只是一个快速编辑,我尝试过查看其他解决方案,但我对我应该寻找的内容有点迷失。我不是在寻找解决方案,也许只是“检查一下并尝试一下”。
最佳答案
count(distinct)
可能会很昂贵。尝试在执行加入
之前进行聚合。我认为以下方法有效(假设不同的旅行之间不共享元素):
select u.id as `User`, tr.Trips, tr.items
from users u inner join
user_emails ue
on u.id = ue.user_id inner join
(select tr.user_id, count(*) as Trips, sum(items) as items
from trips tr join
(select ti.trip_id, count(*) as items
from trip_items ti
group by ti.trip_id
) ti
on ti.trip_id = tr.id
where tr.created_at >= '2017-02-01' and tr.created_at < '2017-02-01 01:00:00'
group by tr.user_id
having trips < 30
) tr
on tr.user_id = u.id inner join
where ue.verified = true and ue.is_primary = true
group by 1
关于mysql - 限制mysql中查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448582/