MySQL连接不返回行
我正在尝试为网站上的登录页面创建一个反暴力工具。不幸的是,我的查询没有按预期工作。我想测试一个IP地址尝试登录的次数,并返回用户的ID,以便我在登录过程中的下一步操作 但是,我对查询有一个问题。。。首先,只有当用户与他们之前尝试登录的用户相同时,才会返回行。我需要它是任何用户。其次,无论我是使用LEFT JOIN、RIGHT JOIN、internal JOIN还是JOIN,它都不会返回用户ID,除非在MySQL连接不返回行,sql,mysql,join,Sql,Mysql,Join,我正在尝试为网站上的登录页面创建一个反暴力工具。不幸的是,我的查询没有按预期工作。我想测试一个IP地址尝试登录的次数,并返回用户的ID,以便我在登录过程中的下一步操作 但是,我对查询有一个问题。。。首先,只有当用户与他们之前尝试登录的用户相同时,才会返回行。我需要它是任何用户。其次,无论我是使用LEFT JOIN、RIGHT JOIN、internal JOIN还是JOIN,它都不会返回用户ID,除非在login\u尝试中有一行供用户使用 SELECT COUNT(`la`.`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?从这里开始,然后以增量步骤添加所需内容。尝试了,在问题中发布了结果。尝试了,在问题中发布了结果。谢谢。我想多问一句不会有多大伤害。谢谢。我想多问一句不会有多大伤害。