首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL子查询聚合类比

SQL子查询聚合类比
EN

Stack Overflow用户
提问于 2017-01-25 22:22:34
回答 1查看 269关注 0票数 0

我有一个SQL查询的工作示例:

代码语言:javascript
复制
SELECT a.user_id, a.latitude, a.longitude, a.accuracy, a.heading, a.speed, a.created_at 
FROM `location` a 
INNER JOIN (
    SELECT user_id, MAX(`created_at`) created_at
    FROM location
    WHERE created_at > :date
    GROUP BY `user_id`
) b ON a.`user_id` = b.`user_id` AND a.`created_at` = b.`created_at`

为每个用户选择今天的最后一个位置

如何在MongoDB中执行此查询?

我在php中得到了它的第一部分(子查询):

代码语言:javascript
复制
$mongodb->getCollection('location')->aggregate([
    ['$match' => ['created_at' => ['$gte' => $beginOfDay]]],
    [
        '$group' => [
            '_id' => '$user_id', 
            'lastTime' => ['$max' => '$created_at']
        ]
    ]
]);

并且不想创建新的查询...

也许在MongoDB中比在关系数据库中更容易做到呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-26 00:46:14

我会尝试不同的方式,而不是映射SQL查询。下面是聚合。

代码语言:javascript
复制
db.location.aggregate([
 {$match : {$gte : beginOfDay}},
 {$sort : {'user_id' : 1, 'created_at' : -1}},
 {$group : {
         _id : '$user_id', 
         created_at: { $first: "$created_at" }, 
         latitude: { $first: "$latitude" }, 
         longitude: { $first: "$longitude" },
         // ....similarly other fields
        }
 }
]);

它主要做的是通过过滤所有具有当天创建的数据的用户的文档进行聚合,然后按user_id和降序created_at排序,然后在分组阶段,对于每个user_id,它在$first运算符的帮助下获得第一个文档数据。

我不确定如何转换为php方式,或者php驱动程序是否允许$first,但值得一试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41853992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档