2012-03-24 2 views
1

У меня есть очень простая таблица:MySQL подсчитывать логины и вернуть последнюю Войти

+----------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+----------+--------------+------+-----+---------+-------+ 
| time  | int(11)  | YES |  | 0  |  | 
| username | varchar(120) | NO | MUL |   |  | 
| ip  | varchar(40) | NO | MUL |   |  | 
| failed | varchar(40) | NO | MUL |   |  | 
+----------+--------------+------+-----+---------+-------+ 

Я ищу для запроса несколько конкретных пользователей, и я хочу как подсчет логинов и самый последний вход (если существуют любые логины). Я пробовал различные комбинации «GROUP BY», и ничего не работает.

Мой простой подсчет запросов заключается в следующем:

mysql> SELECT count(*), username FROM logins WHERE username='[email protected]' and failed='0' group by username; 

Как я могу получить еще одну строку назад, которая содержит как счетчик и последний вход?

Бонусные баллы, если он превращает метку времени в удобный для пользователя формат.

Редактировать: Первый ответ кажется мне самым ясным, и это сработало хорошо.

Я также пришел с этим, что, кажется, работает и возвращается в примерно столько же времени, но я не уверен, что я делаю там с вложенными SELECT:

SELECT COUNT(*), username (SELECT MAX(time)) FROM logins WHERE username='[email protected]' AND failed='0' GROUP BY username; 

И чтобы получить удобочитаемое время:

SELECT COUNT(*), username (SELECT FROM_UNIXTIME(MAX(time))) FROM logins WHERE username='[email protected]' AND failed='0' GROUP BY username; 

и эта версия и более правильный ищут запрос в первом ответе займут около ого 27s (таблица имеет около 161m строк).

+0

незначительно связаны: вы кропотливо создать эту таблицу, или вы использовали некоторые VIM/Emacs вуду, чтобы записать его в один миг? – puk

+0

Это всего лишь результат «объяснить логины» в mysql-клиенте. :) – sporker

ответ

2

Max(time) даст вам последнее время входа в систему. Смотрите полный запрос сильфона

SELECT username, 
     COUNT(*) AS `count`, 
     Max(`time`) AS `latest` 
FROM logins 
WHERE username = '[email protected]' 
     AND failed = '0' 
GROUP BY username; 
+0

Это прекрасно работает, спасибо. – sporker

0

Попробуйте ниже:

SELECT count(*), username,time 
FROM logins 
WHERE username='[email protected]' and failed='0' 
group by username 
order by time desc 

ИЛИ

SELECT count(*), username,max(time) 
FROM logins 
WHERE username='[email protected]' and failed='0' 
group by username 
+0

спасибо, вторая форма, кажется, работает нормально и дает правильную временную метку без «заказа». – sporker

0
select username, count(username) count, max(time) time 
from logins where username in ("a","b") group by username 
+0

Я не понимаю, почему две таблицы соединяются на этом ... – sporker

Смежные вопросы