2010-02-27 229 views
0

我的查询需要做到这一点需要一个MySQL查询

  • 获得用户的详细信息
  • 得到上次登录的是登录失败的登录
  • 保存号码登录的表的帮助,但只有该用户的最后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

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

非常感谢彼得。 – alex 2010-03-01 07:18:10