我正在嘗試爲網站上的登錄頁面創建一個反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'
爲什麼LOGIN_ATTEMPTS.timestamp是一個字符串?請發佈:'DESC LOGIN_ATTEMPTS'的輸出。 – 2010-06-03 00:11:13
一個字符串,因爲我不確定語法。但是,我通過腳本發送變量的方式將它作爲有符號整數發送,它就是這樣。一秒鐘,我會張貼描述。 – 2010-06-03 00:12:42
解釋連接的有用鏈接,如果你還沒有看到它:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – 2010-06-03 00:26:18