2010-02-27 281 views
0

我的查詢需要做到這一點需要一個MySQL查詢

  • 獲得用戶的詳細信息
  • 得到上次登錄的是登錄失敗的登錄
  • 保存號碼登錄的表的幫助,但只有該用戶的最後3次登錄

我的問題似乎是在子查詢中。我想WHERE的一部分引用在外部查詢中早先匹配的user_id。這甚至有可能嗎?我對這個查詢做了大量的混亂嗎?

$query = 'SELECT users.id, 
         users.email, 
         users.password, 
         users.first_name, 
         users.last_name, 
         max(user_logins.datetime) as last_login, 
         count(user_logins.failed) as failed_logins, 

      FROM users, user_logins 
      WHERE users.email = ' . Database::instance()->escape($email) . ' 
       AND users.id = user_logins.user_id 
       AND user_logins.datetime IN (SELECT datetime FROM user_logins WHERE user_id = users.id ) 
      LIMIT 1'; 

last_login似乎工作得很好。我想要最後3個的原因是我可以檢查最後3個是否失敗,然後爲該用戶設置超時登錄。

我不能回去做一個UPDATE users SET failed = 1 WHERE failed = 0,因爲那樣我就不會有一個準確的用戶登錄日誌。我希望看到任何失敗。

我在做什麼錯? 謝謝

回答

1

我會嘗試以下。它應該在子查詢中爲您提供三個最新的登錄,SUM增加失敗登錄的次數並獲取上次登錄的時間。

MySQL允許不列出在GROUP BY中選擇的每一列,而其他數據庫則需要將所需的所有列users添加到GROUP BY

$query = ' 
SELECT u.id, 
     u.email, 
     u.password, 
     u.first_name, 
     u.last_name, 
     MAX(ul.datetime) as last_login, 
     SUM(ul.failed) as failed_logins, 
FROM users u 
JOIN (SELECT user_id, datetime, failed 
     FROM user_logins 
     ORDER BY datetime DESC 
     LIMIT 3) ul 
    ON (u.id = ul.user_id) 
WHERE u.email = ' . Database::instance()->escape($email) . ' 
GROUP BY u.id 
'; 
+0

非常感謝彼得。 – alex 2010-03-01 07:18:10