需要一个MySQL查询
问题描述:
我的查询需要做到这一点需要一个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
,因为那样我就不会有一个准确的用户登录日志。我希望看到任何失败。
我在做什么错? 谢谢
答
我会尝试以下。它应该在子查询中为您提供三个最新的登录,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
';
非常感谢彼得。 – alex 2010-03-01 07:18:10