MySQL连接不返回行

MySQL连接不返回行,sql,mysql,join,Sql,Mysql,Join,我正在尝试为网站上的登录页面创建一个反暴力工具。不幸的是,我的查询没有按预期工作。我想测试一个IP地址尝试登录的次数,并返回用户的ID,以便我在登录过程中的下一步操作 但是,我对查询有一个问题。。。首先,只有当用户与他们之前尝试登录的用户相同时,才会返回行。我需要它是任何用户。其次,无论我是使用LEFT JOIN、RIGHT JOIN、internal JOIN还是JOIN,它都不会返回用户ID,除非在login\u尝试中有一行供用户使用 SELECT COUNT(`la`.`id`),

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

但是,我对查询有一个问题。。。首先,只有当用户与他们之前尝试登录的用户相同时,才会返回行。我需要它是任何用户。其次,无论我是使用LEFT JOIN、RIGHT JOIN、internal JOIN还是JOIN,它都不会返回用户ID,除非在
login\u尝试中有一行供用户使用

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\u尝试的输出

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     
此查询执行相同的操作,只是如果在登录尝试中有一行与之对应,则该查询甚至不选择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' 

尝试将ip_地址和时间戳移动到联接条件中。您需要外部连接才能登录。\p>尝试将ip地址和时间戳移动到连接条件中。您需要外部联接才能登录。\u尝试。

不要使用联接,请将查询分开。对其中一个中的尝试次数进行计数,并在另一个中返回用户id:

sql 1:

select count(id) from login_attempts where ip_address="<ipaddress>"
从登录尝试中选择计数(id),其中ip\u address=“”
sql 2:

select id from users where username="<username>"
从username=“”所在的用户中选择id
如果您确实坚持使用联接,我认为这确实是不必要的:

select count(login_attempts.id), users.id
from users
cross join login_attempts
where users.username="<username>"
and login_attempts.ip_address="<ipaddress>"
选择count(login\u attempts.id)、users.id
来自用户
交叉连接登录尝试
where users.username=“”
和登录尝试。ip地址=“”

我也认为这是低效的。

不要使用连接,而是分离查询。对其中一个中的尝试次数进行计数,并在另一个中返回用户id:

sql 1:

select count(id) from login_attempts where ip_address="<ipaddress>"
从登录尝试中选择计数(id),其中ip\u address=“”
sql 2:

select id from users where username="<username>"
从username=“”所在的用户中选择id
如果您确实坚持使用联接,我认为这确实是不必要的:

select count(login_attempts.id), users.id
from users
cross join login_attempts
where users.username="<username>"
and login_attempts.ip_address="<ipaddress>"
选择count(login\u attempts.id)、users.id
来自用户
交叉连接登录尝试
where users.username=“”
和登录尝试。ip地址=“”

我也认为这是低效的。

为什么
登录尝试。timestamp
是一个字符串?请发布以下输出:
DESC LOGIN\u尝试
。一个字符串,因为我不确定语法。但是,我通过脚本发送变量的方式将其作为有符号整数发送,实际上是这样。请稍等片刻,我将发布描述。如果您没有看到,请使用有用的链接解释连接:我看到了,我尝试了我认为会首先起作用的连接,但没有,我尝试了其余的连接,正如我在问题中所说,它们都没有按预期起作用。您确定在
登录尝试中有时间戳值为1或以上的数据吗,ip地址是127.0.0.1?从这里开始,然后逐步添加所需内容。为什么
LOGIN\u尝试。timestamp
是一个字符串?请发布以下输出:
DESC LOGIN\u尝试
。一个字符串,因为我不确定语法。但是,我通过脚本发送变量的方式将其作为有符号整数发送,实际上是这样。请稍等片刻,我将发布描述。如果您没有看到,请使用有用的链接解释连接:我看到了,我尝试了我认为会首先起作用的连接,但没有,我尝试了其余的连接,正如我在问题中所说,它们都没有按预期起作用。您确定在
登录尝试中有时间戳值为1或以上的数据吗,ip地址是127.0.0.1?从这里开始,然后以增量步骤添加所需内容。尝试了,在问题中发布了结果。尝试了,在问题中发布了结果。谢谢。我想多问一句不会有多大伤害。谢谢。我想多问一句不会有多大伤害。