2013-05-27 13 views
5

mam następującą tabelę,jak używać gdzie klauzula po grupie przez wynik w mysql

mysql> select username,authdate from radpostauth; 
+------------+---------------------+ 
| username | authdate   | 
+------------+---------------------+ 
| timetest | 2013-05-21 22:44:46 | 
| timetest | 2013-05-21 23:54:20 | 
| coconeja | 2013-05-22 00:01:42 | 
| coconeja | 2013-05-22 00:06:35 | 
| coconeja | 2013-05-25 22:35:34 | 
| timetest | 2013-05-25 23:04:54 | 
| distom11 | 2013-05-25 23:10:47 | 
| distom11 | 2013-05-25 23:16:42 | 
| test  | 2013-05-25 23:45:16 | 
| pepe  | 2013-05-26 00:07:00 | 
| doce  | 2013-05-26 00:46:48 | 
| 6096753968 | 2013-05-26 01:42:30 | 
| 2269664468 | 2013-05-26 01:43:57 | 
| 2076877624 | 2013-05-26 02:01:53 | 
| 4446830988 | 2013-05-26 02:02:28 | 
| 2076877624 | 2013-05-26 02:08:53 | 
| 3906187975 | 2013-05-26 22:00:30 | 
| 3906187975 | 2013-05-26 22:21:44 | 
| kk   | 2013-05-26 22:32:20 | 
| kk   | 2013-05-26 22:44:19 | 
| 160059817 | 2013-05-27 00:53:56 | 
| yibced9 | 2013-05-27 13:32:00 | 
| yibced9 | 2013-05-27 13:37:53 | 
| yibced9 | 2013-05-27 13:38:01 | 
| yibced9 | 2013-05-27 13:38:02 | 
| yibced9 | 2013-05-27 13:38:03 | 
| yibced9 | 2013-05-27 13:38:39 | 
| yibced9 | 2013-05-27 13:38:40 | 
| yibced9 | 2013-05-27 13:38:41 | 
| yibced9 | 2013-05-27 13:44:40 | 

Chcę znaleźć „nazwy użytkownika”, który jako pierwszy dostęp był w ciągu ostatnich 12 godzin.

wiem jak dostać się po raz pierwszy każdy użytkownik były rejestrowane za pomocą następującego zapytania

mysql> select username,min(authdate) from radpostauth group by username; 
+------------+---------------------+ 
| username | min(authdate)  | 
+------------+---------------------+ 
| 160059817 | 2013-05-27 00:53:56 | 
| 2076877624 | 2013-05-26 02:01:53 | 
| 2269664468 | 2013-05-26 01:43:57 | 
| 3906187975 | 2013-05-26 22:00:30 | 
| 4446830988 | 2013-05-26 02:02:28 | 
| 6096753968 | 2013-05-26 01:42:30 | 
| coconeja | 2013-05-22 00:01:42 | 
| distom11 | 2013-05-25 23:10:47 | 
| doce  | 2013-05-26 00:46:48 | 
| kk   | 2013-05-26 22:32:20 | 
| pepe  | 2013-05-26 00:07:00 | 
| test  | 2013-05-25 23:45:16 | 
| timetest | 2013-05-21 22:44:46 | 
| yibced9 | 2013-05-27 13:32:00 | 
+------------+---------------------+ 

więc teraz jestem triying dostać te nazwy użytkownika w ten sposób:

select * 
from radpostauth 
where (
    select username,min(authdate) 
    from radpostauth group by username 
    ) > timediff(now(),maketime(12,0,0,)); 

ale obviouly go nie działa ...

Odpowiedz

10
select username, min(authdate) 
from radpostauth 
group by username 
having min(authdate) > NOW() - INTERVAL 12 HOUR 

W języku SQL: WHERE ogranicza wiersze, ale HAVING ogranicza g roups.

+2

bardziej jak gdzie działa na poziomie wiersza podczas skanowania tabeli, posiadające działa na poziomie ustalonym wynikiem, mimo wszystko funkcje agregujące mają obliczone wyniki. –

0

doskonałą odpowiedzią jest Bill tutaj, ale na próbie sake kompletności Dawida warto sprostowanie:

SELECT * 
FROM (
    SELECT username, MIN(authdate) as min_authdate 
    FROM radpostauth 
    GROUP BY username 
) T 
WHERE min_authdate > NOW() - INTERVAL 12 HOUR;