2013-12-12 39 views
-2

我有我們網站的登錄日誌列表,但是我需要查看哪個用戶標識擁有最多的IP登錄到其中。我們的表如下:MySQL從用戶標識中選擇最常用的IP

用戶ID,IP,日期(UNIX)

我需要它輸出的用戶ID的已經最IP的登錄到他們其中。

我試過的東西,如:

SELECT 
    userID 
FROM loginLogs 
GROUP BY userID 
HAVING COUNT(DISTINCT ip) > 1 

但是,這只是顯示的用戶ID的列表。

+0

你不要求有唯一的第一記錄的最用戶? – giammin

回答

2
Select userID, count(distinct ip) 
from loginLogs 
Group by 1 
Order by 2 desc 
+0

「1」和「2」不是可以分組或排序的列嗎? – jjs9534

+0

@ jjs9534。 1和2指的是SELECT中列的順序。在這個查詢中的問題是,它應該是ORDER BY 2 DESC,否則這個工作 –

+0

感謝您的知識。 – jjs9534

0

您有權責令這些結果order by COUNT(DISTINCT ip ) desc並採取第一Limit 0, 1

SELECT `userID` 
FROM `loginLogs` 
GROUP BY `userID` 
ORDER BY COUNT(DISTINCT `ip`) desc 
LIMIT 0, 1 
1

也許這樣嗎?

SELECT `userID`, count(`ip`) cnt FROM `loginLogs` GROUP BY `userID` HAVING cnt > 1 
+0

這可以工作,但它顯示登錄的總數,而不是唯一的IP登錄。 – user1372896

0
SELECT userID, COUNT(*) AS count FROM loginLogs 
GROUP BY userId ORDER BY count DESC 

這會給你所有用戶的大多數登錄到最少。如果要限制結果,請使用LIMIT 1。

0

您可以將您在子查詢中包含的內容包裝成用戶標識和不同的IP列表。

SELECT DISTINCT ll.`userID`, ll.`ip` 
FROM ( SELECT `userID`, COUNT(1) AS Cnt 
     FROM `loginLogs` 
     GROUP BY `userID` 
     HAVING COUNT(DISTINCT `ip`) > 1) id 
LEFT JOIN `loginLogs` ll 
    ON id.`userID` = ll.`userID` 
ORDER BY id.`Cnt`; 
1

您可以通過不同的值進行排序,降序;

SELECT userID, COUNT(DISTINCT ip) `distinct IP#s` 
FROM loginLogs 
GROUP BY userID 
ORDER BY `distinct IP#s` DESC; 

An SQLfiddle to test with

+0

這是最好的答案。 Asker在接受答案前應等待幾分鐘。 –

0

如果你只是想看看最IPS的用戶,你也希望看到IP列表,你可以使用GROUP_CONCAT()

SELECT `userID`, group_concat(DISTINCT `ip`) 
FROM `loginLogs` 
GROUP BY `userID` 
ORDER BY COUNT(DISTINCT `ip`) DESC 
LIMIT 1