我有两个登录表和一个用于跟踪worng登录尝试的登录尝试表
登录表
| id | username | password |
| 1 | Jon | 1234 |
| 2 | Danny | ttttt |
| 7 | Martin | fffff |
尝试表
| id_attempts| time |
| 1 | 535353 |
| 2 | 554335 |
| 1 | 654545 |
| 1 | 566777 |
查询必须将用户标识为已授权,请检查数据库中是否有用户名/密码的组合,但必须返回该用户的错误尝试次数,即使用户名和密码错误也是如此。 我试过这个:
SELECT u.id,count(p.id_attempts)
FROM login as l, attempts as a
LEFT JOIN
ON l.id=a.id_attempts
WHERE username=Jon
AND pass=1234
编辑:
Exmple Jon尝试登录,如果用户名和密码正确,查询必须返回jon id和3(jon错误尝试次数)如果jon用户名和密码错误查询必须只返回3(jon错误尝试次数)
答案 0 :(得分:1)
而不是“如果jon用户名和密码错误,查询必须只返回3(jon错误尝试次数)”我建议使用其他列来返回授权状态。例如
此外,由于在查询中指定了用户名,因此返回用户标识或用户名没有多大意义。
SELECT l.username, count(l.id) attempts, l.password='1234' authorized
FROM login as l LEFT JOIN attempts as a
ON l.id=a.id_attempts
WHERE l.id=1
GROUP BY l.username
将返回:
username,attempts,authorized
Jon,3,1
其中1表示授权,0表示未授权。
但如果您真的想满足原来的要求,请执行以下操作:
SELECT IF( l.password = '1234' && l.id =1, l.id, "" ) id, COUNT( l.id ) attempts
FROM login AS l
LEFT JOIN attempts AS a ON l.id = a.id_attempts
WHERE l.id =1
GROUP BY l.username
要获得正确的密码,将返回: ID,尝试 1,3
如果没有正确的密码,则会返回: ID,尝试 ,3
答案 1 :(得分:1)
我不知道您使用的是哪个数据库引擎,因为您已将mysql和postgresql同时指定为标记,但这里是select语句在PostgreSQL中的样子:
SELECT (CASE WHEN l.password = ? THEN l.id END) AS userId,
COUNT(a.id_attempts) AS numAttempts
FROM login l LEFT JOIN attempts a ON a.id_attempts=l.id
WHERE l.username = ?
GROUP BY l.id;
答案 2 :(得分:0)
我不确定如何判断你的例子中的尝试是否成功,但是这会让你计算次数
select
l.username,
count(1) as NumAttempts
from login l
join attempts a
on l.id = a.id_attempts
where l.id = 1
and l.password = '1234'
group by l.username