mysql - 限制mysql中查询数据

标签 mysql sql

几年后我重新回到 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/

相关文章:

PHP 执行查询的时间比 MySQL 长得多

php - 显示最高报价,但仍然显示没有报价

php - 在 laravel 5 中搜索查询

sql - NHibernate Linq 中前 5 个元素的总和

sql - 使用 LINQ to SQL 设计仅附加数据访问层

sql - SQL Server 2005 中的模数时间 - 每 n 小时返回一次数据

mysql - SQL脚本获取角色位置

php - 进度条分割

Android删除查询数据库

mysql - 根据日期范围过滤列