带count()连接的SQL查询以及表到的位置

时间:2014-11-14 20:30:44

标签: mysql sql postgresql mysqli

我有两个登录表和一个用于跟踪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错误尝试次数)

3 个答案:

答案 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