MySQL连接不返回行

时间:2010-06-03 00:02:51

标签: sql mysql join

我正在尝试为网站上的登录页面创建一个反bruteforcer。不幸的是,我的查询没有按预期工作。我想测试IP地址尝试登录的次数,并在登录过程中为我的下一步返回用户的ID。

但是,我遇到了查询问题......首先,如果它们与之前尝试登录的用户相同,则只返回行。我需要它成为任何用户。其次,无论我使用LEFT JOIN,RIGHT JOIN,INNER JOIN还是JOIN,它都不会返回用户的ID,除非login_attempts中的用户有一行。

SELECT COUNT(`la`.`id`), 
       `u`.`id`
FROM `users` AS `u` 
LEFT JOIN `login_attempts` AS `la` ON `u`.`id` = `la`.`user_id`
WHERE `u`.`username` = 'admin' 
  AND `la`.`ip_address` = '127.0.0.1' 
  AND `la`.`timestamp` >= '1'

以下是DESC login_attempts

的输出
Field       Type                Null    Key Default Extra
id          int(10) unsigned    NO      PRI NULL    auto_increment
user_id     int(10) unsigned    NO      MUL NULL     
ip_address  varchar(15)         NO      MUL NULL     
timestamp   int(10)             NO          NULL     

此查询执行相同的操作,但如果在与之对应的login_attempts中有一行,则甚至不选择ID:

SELECT COUNT(`la`.`id`), 
       `u`.`id`
FROM `users` AS `u` 
LEFT OUTER JOIN `login_attempts` AS `la` ON `u`.`id` = `la`.`user_id` 
  AND `la`.`ip_address` = '127.0.0.1' 
  AND `la`.`timestamp` >= '1'
WHERE `u`.`username` = 'admin' 

2 个答案:

答案 0 :(得分:3)

不要使用联接,并分开查询。在一个中计算尝试次数,并在另一个中返回用户ID:

sql 1:

select count(id) from login_attempts where ip_address="<ipaddress>"

sql 2:

select id from users where username="<username>"

如果你真的坚持使用联接,我认为这是不必要的:

select count(login_attempts.id), users.id
from users
cross join login_attempts
where users.username="<username>"
and login_attempts.ip_address="<ipaddress>"

我认为这也是效率低下的。

答案 1 :(得分:0)

尝试将ip_address和timestamp移动到连接条件。您需要一个外部联接到login_attempts。