mysql - 需要 MySQL 查询帮助

标签 mysql authentication

我的查询需要执行此操作

  • 获取用户详细信息
  • 从记录的登录表中获取上次登录
  • 获取失败登录的次数,但来自该用户最近 3 次登录

我的问题似乎出在子查询中。我希望其中的 WHERE 部分引用先前在外部查询中匹配的 user_id 。这可能吗?我是否把这个查询弄得一团糟?

$query = 'SELECT users.id, 
                         users.email, 
                         users.password, 
                         users.first_name, 
                         users.last_name,
                         max(user_logins.datetime) as last_login,
                         count(user_logins.failed) as failed_logins,

            FROM users, user_logins
            WHERE users.email = ' . Database::instance()->escape($email) . '
                AND users.id = user_logins.user_id
                AND user_logins.datetime IN (SELECT datetime FROM user_logins WHERE user_id = users.id  )
            LIMIT 1';

last_login 似乎运行良好。我想要最后3个的原因是这样我可以检查最后3个是否失败,然后为该用户登录设置一个超时。

我无法返回并执行UPDATE users SET failed = 1 WHERE failed = 0,因为那样我将无法获得准确的用户登录日志。我希望看到任何失败的案例。

我做错了什么? 谢谢

最佳答案

我会尝试以下操作。它应该在子查询中为您提供最近的 3 次登录,SUM 计算失败登录的次数并获取上次登录的时间。

MySQL 允许不列出在 GROUP BY 中选择的每一列,对于其他数据库,您必须添加所有 users 列您需要GROUP BY

$query = '
SELECT u.id, 
       u.email, 
       u.password, 
       u.first_name, 
       u.last_name,
       MAX( ul.datetime ) as last_login,
       SUM( ul.failed ) as failed_logins,
FROM users u
JOIN ( SELECT user_id, datetime, failed
       FROM user_logins
       ORDER BY datetime DESC
       LIMIT 3 ) ul
  ON ( u.id = ul.user_id )
WHERE u.email = ' . Database::instance()->escape($email) . '
GROUP BY u.id
';

关于mysql - 需要 MySQL 查询帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2346680/

相关文章:

java - micronaut 的 @AuthenticationPrincipal 替代方案是什么?

mysql - 在 MySQL 中查找具有重复记录的 ID

MySql 查询不使用复合索引

python - 对于类似的命令,python 和 mysql 的结果不同

mysql - Java调度线程杀死数据库

使用双因素身份验证通过 https 从 GitHub 克隆 Git

node.js - Django 和 NodeJs - 管理身份验证

MySQL设置默认ID UUID

android - 如何在 Android 中创建 SplashScreen Facebook 登录 Activity

python - 使用 selenium 登录 stackoverflow 可以正常工作,但使用 scrapy python 则不行。如何使用 headless 浏览登录?