2012-05-17 44 views
2

我有一個表用於存儲對radius服務器的所有訪問請求,如下所示:MySQL從列a中爲每個不同的列b選擇所有不同的值,其中計數不同a> 1

describe radius.loginattempts; 
+------------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+------------------+------------------+------+-----+---------+----------------+ 
| loginattempt_key | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| log_date   | int(10) unsigned | NO |  | NULL |    | 
| result   | tinyint(1)  | YES |  | NULL |    | 
| username   | text    | YES |  | NULL |    | 
| mac    | text    | YES |  | NULL |    | 
+------------------+------------------+------+-----+---------+----------------+ 

每次有人嘗試登錄時,無論是否有效,都會在此表中創建日誌條目。

我想要做的是獲取所有有兩個或更多用戶嘗試登錄的設備的列表,以及每個設備的所有不同用戶名。

所以,如果我有一些數據,看起來像這樣:

select * from loginattempts limit 8; 
+------------------+------------+--------+----------+-------------------+ 
| loginattempt_key | log_date | result | username | mac    | 
+------------------+------------+--------+----------+-------------------+ 
|    1 | 1337035334 |  1 | kclark | 11:11:11:11:11:11 | 
|    2 | 1337035620 |  1 | kclark | 22:22:22:22:22:22 | 
|    3 | 1337035681 |  0 | guest | 33:33:33:33:33:33 | 
|    4 | 1337035740 |  1 | guest | 22:22:22:22:22:22 | 
|    5 | 1337037782 |  1 | rfogarty | 44:44:44:44:44:44 | 
|    6 | 1337037789 |  1 | jsmith | 44:44:44:44:44:44 | 
|    7 | 1337037790 |  1 | jsmith | 44:44:44:44:44:44 | 
|    8 | 1337037791 |  1 | jsmith | 44:44:44:44:44:44 | 
+------------------+------------+--------+----------+-------------------+ 

我想一個神奇的查詢,返回是這樣的:

+-------------------+----------+ 
| mac    | username | 
+-------------------+----------+ 
| 22:22:22:22:22:22 | kclark | 
| 22:22:22:22:22:22 | guest | 
| 44:44:44:44:44:44 | rfogarty | 
| 44:44:44:44:44:44 | jsmith | 
+-------------------+----------+ 

這最終會在PHP中,和我可以通過兩個查詢和一個for循環輕鬆完成,但作爲一個思考實驗,我一直在想如何用單個查詢和一些奇特的連接(或者甚至是子查詢)來做到這一點,但無法包住我的頭在它周圍...

mysql -V 
mysql Ver 14.14 Distrib 5.1.52, for unknown-linux-gnu (x86_64) using readline 5.1 

回答

1

OK,我想你的意思是這... http://sqlfiddle.com/#!3/b6100/6

鑑於

create table loginattempts 
(
    login_key int, 
    mac varchar(12) null, 
    username varchar(12) null 
) 

insert into loginattempts values (1, 111, 'peter') 
insert into loginattempts values (2, 111, 'bob') 
insert into loginattempts values (3, 222, 'geoff') 
insert into loginattempts values (4, 222, 'lisa') 
insert into loginattempts values (1, 333, 'peter') 

你需要這個查詢

select mac, username 
    from loginattempts 
    where 
    mac in 
    (
     select mac 
     from loginattempts 
     group by mac 
     having count(*) > 1 
    ) 

給你

MAC USERNAME 
111 peter 
111 bob 
222 geoff 
222 lisa 
+0

YES!謝謝!我不得不作出一個小小的改變,將「有(*)> 1」改爲「有數(不同的用戶名)> 1」。 – JoeTomato

+0

實際上,另一個變化是:必須在最後添加另一個組,以便每個用戶/ mac組合只有一行。所以,我的最終查詢結束了: 選擇MAC,用戶名 從loginattempts 其中 MAC在 ( 選擇MAC 從loginattempts 組由MAC 具有計數(不同的用戶名)> 1 ) 組由MAC,用戶名 order by mac asc ; 再次感謝! – JoeTomato

相關問題