需要MySQL查询的帮助

时间:2010-02-27 08:27:09

标签: 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,因为我无法准确记录用户登录信息。我希望看到任何失败。

我做错了什么? 感谢

1 个答案:

答案 0 :(得分:1)

我会尝试以下方法。它应该在子查询中提供三个最新登录,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
';