【问题标题】:MySQL join not returning rowsMySQL加入不返回行
【发布时间】:2010-06-03 00:02:51
【问题描述】:

我正在尝试为网站上的登录页面创建反暴力破解程序。不幸的是,我的查询没有按预期工作。我想测试一个 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' 

【问题讨论】:

  • 为什么LOGIN_ATTEMPTS.timestamp 是一个字符串?请将输出发布自:DESC LOGIN_ATTEMPTS
  • 一个字符串只是因为我不确定语法。但是,我通过脚本发送变量的方式将其作为有符号整数发送,它就是这样。一秒钟,我会发布描述。
  • 有用的链接解释连接如果你还没有看到它:codinghorror.com/blog/2007/10/…
  • 我已经看过了,我尝试了我认为会首先工作的那个,它没有,我尝试了其余的,但正如我在我的问题中所说的那样,它们都没有按预期工作。
  • 您确定LOGIN_ATTEMPTS 中的数据的时间戳值都为1 或更大,并且ip_address 为127.0.0.1?从那里开始,然后逐步添加您需要的内容。

标签: sql mysql join


【解决方案1】:

不要使用连接,而是分开查询。一次计算尝试次数,另一次返回用户 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>"

我也认为效率低下。

【讨论】:

  • 谢谢。我认为使用额外的查询不会有太大的伤害。
【解决方案2】:

尝试将 ip_address 和时间戳移到连接条件中。您需要外连接到 login_attempts。

【讨论】:

  • 试过了,把结果贴在问题里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多