Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在另一个表中抓取上次在两个日期之间登录的所有用户_Mysql - Fatal编程技术网

Mysql 在另一个表中抓取上次在两个日期之间登录的所有用户

Mysql 在另一个表中抓取上次在两个日期之间登录的所有用户,mysql,Mysql,我想抓取在两个特定日期之间最后一次登录的所有用户。如何做到这一点 注意:我之所以在更新sub.u,是因为: 登录会话可能持续一天以上 相同的用户可以登录到不同的pc并启动辅助会话 我需要获取用户启动的最后一个会话,然后检查它上次更新的时间 示例构建: 因此,从sqlfiddle上的示例中,我希望查询选择Bill,因为updated_at,对于他的最后记录,是在2019-09-15 00:00:00和2019-09-15 23:59:59之间。在这两个日期之间,John的一个条目也被更新,但他的最

我想抓取在两个特定日期之间最后一次登录的所有用户。如何做到这一点

注意:我之所以在更新sub.u,是因为:

  • 登录会话可能持续一天以上
  • 相同的用户可以登录到不同的pc并启动辅助会话
  • 我需要获取用户启动的最后一个会话,然后检查它上次更新的时间
  • 示例构建:

    因此,从sqlfiddle上的示例中,我希望查询选择
    Bill
    ,因为
    updated_at
    ,对于他的最后记录,是在
    2019-09-15 00:00:00
    2019-09-15 23:59:59
    之间。在这两个日期之间,
    John的一个
    条目也被更新,但他的最新记录是在
    2019-09-18 12:00:00
    更新的,因此不应选择John


    这是一个可能的解决方案,但我担心性能,索引
    update\u at
    应该会有积极的效果,但是如果我们有超过1mil的用户和更多的用户登录,会怎么样

    SELECT *
    FROM 
    (
        SELECT *
        FROM (
            SELECT * 
            FROM `user_logins`
            WHERE `updated_at` >= '2019-09-15 00:00:00'
            ORDER BY `user_logins`.`id`  DESC
        ) as sub 
        GROUP BY `sub`.user_id
    ) as sub 
    WHERE `sub`.updated_at BETWEEN '2019-09-15 00:00:00' and '2019-09-15 23:59:59'
    

    您的查询可以简化为-

    SELECT U.*, UL.*
    FROM users U
    JOIN user_logins UL ON U.id = UL.user_id
    JOIN (SELECT user_id, MAX(updated_at) updated_at
          FROM user_logins
          GROUP BY user_id) UL2 ON UL2.updated_at = UL.updated_at
                                AND UL2.user_id = UL.user_id
    WHERE DATE(UL2.updated_at) BETWEEN DATE('2019-09-15 00:00:00') AND DATE('2019-09-15 23:59:59')
    ORDER BY UL.id DESC
    

    是小提琴。

    请用相关的、最少的示例数据来构建SQL问题,以显示您的需求和相应的预期输出。请阅读此链接:此查询获取单个用户,我需要获取符合条件的所有用户。因此,从fiddles示例中,如果我要使用您的查询(不包括限制),如果更新时间在
    2019-09-15 00:00:00
    2019-09-15 23:59:59
    之间,我将同时选择Tim和John。我更新了查询,而不仅仅是Tim@user3402600。请现在试一试。这是最新的提琴-感谢Ankit,但是,您的查询仍然选择John。您在评论中看到提琴了吗?它完美地选择了这两个记录。
    SELECT U.*, UL.*
    FROM users U
    JOIN user_logins UL ON U.id = UL.user_id
    JOIN (SELECT user_id, MAX(updated_at) updated_at
          FROM user_logins
          GROUP BY user_id) UL2 ON UL2.updated_at = UL.updated_at
                                AND UL2.user_id = UL.user_id
    WHERE DATE(UL2.updated_at) BETWEEN DATE('2019-09-15 00:00:00') AND DATE('2019-09-15 23:59:59')
    ORDER BY UL.id DESC