2014-11-14 47 views
0

我有兩個talbles登錄表和軌道撥錯的登錄嘗試登錄嘗試表的SQL查詢與計數()連接並在上表

登錄表

| id | username | password | 
| 1 |  Jon  | 1234 | 
| 2 |  Danny | ttttt | 
| 7 |  Martin | fffff | 

嘗試表

| id_attempts| time  | 
|  1  | 535353 | 
|  2  | 554335 | 
|  1  | 654545 | 
|  1  | 566777 | 

查詢必須將用戶標識爲授權用戶,檢查數據庫中用戶名/密碼的組合,但必須返回該用戶的不正確嘗試次數,即使用戶名和密碼是錯誤的。 I'have試試這個:

  SELECT u.id,count(p.id_attempts) 
      FROM login as l, attempts as a 
      LEFT JOIN 
      ON l.id=a.id_attempts 
      WHERE username=Jon 
      AND pass=1234 

編輯:

Exmple喬恩嘗試登錄,如果用戶名和密碼是正確的查詢必須返回喬恩ID,如果喬恩的用戶名3(數喬恩錯誤嘗試的)和密碼是錯誤的查詢必須返回只有3個(喬恩錯誤嘗試的次數)

+1

你的問題是完全不清楚 – 2014-11-14 20:40:14

+0

是一個簡單的登錄查詢,但必須返回不正確的嘗試次數爲用戶,如果他們存在 – 2014-11-14 20:42:45

+0

那是什麼'時間'欄代表? – 2014-11-14 20:44:41

回答

1

而不是「如果jon的用戶名和密碼是錯誤的查詢必須只返回3(jon錯誤嘗試的次數)」我建議使用額外的列而不是返回授權狀態。例如

此外,由於在查詢中指定了用戶名,因此返回用戶標識或用戶名沒有多大意義。

SELECT l.username, count(l.id) attempts, l.password='1234' authorized 
FROM login as l LEFT JOIN attempts as a 
ON l.id=a.id_attempts 
WHERE l.id=1 
GROUP BY l.username 

將返回:

username,attempts,authorized 
Jon,3,1 

1只意味着授權和0並不認可。

但是,如果你真的想滿足你的原始需求,做到這一點:

SELECT IF(l.password = '1234' && l.id =1, l.id, "") id, COUNT(l.id) attempts 
FROM login AS l 
LEFT JOIN attempts AS a ON l.id = a.id_attempts 
WHERE l.id =1 
GROUP BY l.username 

對於正確的密碼,這將返回: ID,試圖 1,3

如果沒有正確的密碼,這將返回: ID,嘗試 ,3

0

我不知道你是如何知道的嘗試是否是從你的例子成功但是這給你算嘗試

select 
    l.username, 
    count(1) as NumAttempts 
from login l 
join attempts a 
    on l.id = a.id_attempts 
where l.id = 1 
    and l.password = '1234' 
group by l.username 
+0

也必須返回該用戶的錯誤嘗試次數,即使用戶名和密碼錯誤 – 2014-11-14 20:57:32

+0

您在那裏丟失了我。我不知道根據你的數據,你可以告訴正確與不正確的嘗試。 – SQLChao 2014-11-14 21:00:07

+0

@AlbertoAlibaba給我們提供了一個期望輸出的例子,並且正確解釋它,否則沒有人可以幫助你。 – Radix 2014-11-14 21:01:28

1

我不知道你正在使用哪個數據庫引擎,因爲你指定了mysql和postgre SQL作爲標籤,但這裏的select語句看起來像在PostgreSQL的:

SELECT (CASE WHEN l.password = ? THEN l.id END) AS userId, 
    COUNT(a.id_attempts) AS numAttempts 
FROM login l LEFT JOIN attempts a ON a.id_attempts=l.id 
WHERE l.username = ? 
GROUP BY l.id;