2010-06-03 88 views
0

我正在嘗試爲網站上的登錄頁面創建一個反bruteforcer。不幸的是,我的查詢沒有按預期工作。我想測試一個IP地址嘗試登錄的次數,並且還要返回用戶的ID以用於登錄過程中的下一步。MySQL加入不返回行

但是,我遇到了查詢問題......一方面,如果它是與之前嘗試登錄的用戶相同的用戶,則只會返回行。我需要它是任何用戶。其次,無論是否使用LEFT JOIN,RIGHT JOIN,INNER JOIN或JOIN,除非用戶在login_attempts中有一行,否則不會返回用戶ID。

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  

這個查詢做同樣的事情的輸出,除了甚至不選擇ID,如果有對應於它login_attempts行:

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' 
+0

爲什麼LOGIN_ATTEMPTS.timestamp是一個字符串?請發佈:'DESC LOGIN_ATTEMPTS'的輸出。 – 2010-06-03 00:11:13

+0

一個字符串,因爲我不確定語法。但是,我通過腳本發送變量的方式將它作爲有符號整數發送,它就是這樣。一秒鐘,我會張貼描述。 – 2010-06-03 00:12:42

+0

解釋連接的有用鏈接,如果你還沒有看到它:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – 2010-06-03 00:26:18

回答

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>" 

我也認爲這將是低效的。

+0

謝謝。我想通過額外的查詢不會傷害太多。 – 2010-06-03 01:08:13

0

嘗試將ip_address和時間戳移入連接條件。你需要一個外連接到login_attempts。

+0

試過了,在結果中發佈了問題。 – 2010-06-03 00:19:20