Нужна помощь с запросом MySQL - PullRequest
0 голосов
/ 27 февраля 2010

Мой запрос должен сделать это

  • получить данные пользователя
  • получить последний вход в систему из таблицы входов в систему
  • получить количество неудачных входов в систему, но только из последних 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 Ответ

1 голос
/ 27 февраля 2010

Я бы попробовал следующее. Он должен дать вам три последних входа в подзапрос, 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
';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...