2014-10-17 30 views
1

我有一個數據庫結構:MySQL分組兩次

ip | yid |日期

其中ip代表用戶的IP並且yid是特定頁面ID。我正在嘗試通過ipyid列進行分組,這一點我已在下面完成。但之後我需要將這些結果按yid分組。所以它會被分組到:

yid |計數

其中count是頁面被調用的次數,每個ip地址限制1次調用。

現在我有:

SELECT `ip`, `yid`, `time`, MAX(`time`), count(*) 
FROM mp_downloads 
GROUP BY CONCAT(`ip`, `yid`), `yid` 
ORDER BY count(*) DESC 

但它不是由不同的yid & ip組合這組分組後的頁面ID。

回答

1

試一試使用嵌套查詢:

select temp.*, count(*) from 
(SELECT `ip`, `yid`, `time`, MAX(`time`) 
FROM mp_downloads 
GROUP BY CONCAT(`ip`, `yid`))temp group by temp.yid; 
+0

這個工程,但我不得不刪除'ORDER BY count(*)DESC'。 – user1345650 2014-10-17 03:59:51

0

用於獲取已訪問的IP地址數的規範性圖案(yid)將是:

SELECT d.yid 
    , COUNT(DISTINCT d.ip) AS ip_count 
    , MAX(d.date)   AS latest_time 
FROM mp_downloads d 
GROUP BY d.yid 

爲了獲得最佳性能,你會想要一個合適的索引,例如

... ON mp_downloads (yid, ip, date) 

沒有必要通過連接兩列的表達式進行分組。不需要派生表(內聯視圖)或子查詢。如果您不需要latest_time,則可以省略該表達式。

+0

有沒有辦法在這個查詢中獲得'latest_time'的平均值? – user1345650 2014-10-17 04:18:37

+0

如果你的意思是你想爲每個「(yid,ip)」設置「最新」時間,然後你想「平均」這些值,那就需要一個子查詢(在SELECT列表中,或者作爲內聯視圖),或者一些有關排序和用戶定義變量的技巧。並且計算平均值的表達式將取決於「日期」列的數據類型。 (如果這個要求是規範的一部分,那麼它應該包含在問題中,而不是作爲對答案的評論。) – spencer7593 2014-10-17 04:40:19

+0

只是說,其他解決方案允許人們簡單地將AVG(時間)查詢。我只是想知道是否有一個簡單的方法通過你的答案來做到這一點 – user1345650 2014-10-17 05:27:33