我的查询需要这样做
我的问题似乎是在子查询中。我希望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
,因为我无法准确记录用户登录信息。我希望看到任何失败。
我做错了什么? 感谢
答案 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
';