2014-01-14 46 views
0

我瀏覽了與此問題相關的所有500多個答案的摘要,但沒有發現明顯的SQL解決方案來解決我的問題。也許沒有。通過在公司簡介上點擊Top10公司的SQL?或更好的解決方案?

我希望通過在nnn到nnn期間點擊公司簡介來顯示Top10 Companies。

MySQL表來跟蹤公司簡介

CREATE TABLE `hit_company` (
    `id` mediumint(9) unsigned NOT NULL AUTO_INCREMENT, 
    `hitdate` date NOT NULL DEFAULT '0000-00-00', 
    `customerid` mediumint(9) unsigned NOT NULL DEFAULT '0', 
    `organization` varchar(80) DEFAULT NULL, 
    `hitstamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `remote_addr` varchar(20) DEFAULT NULL, 
    `hittime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=123456 ; 

的MySQL查詢在24小時報告如下所示點擊:

SELECT hitstamp,hitdate,customerid,organization, COUNT(organization) AS 'count' FROM hit_company 
WHERE hitstamp >= '2014-01-12 21:23' AND hitstamp <= '2014-01-13 21:23' 
GROUP BY customerid ORDER BY count DESC LIMIT 10 

這產生了十佳。問題在於,我通過更新remote_addr來刷新其公司資料頁而顯着增加了點擊量,從而人爲地增加了他們的計數器。我只想在報告時間範圍內每個公司每個IP計數1票。

我也考慮過,但我不知道如何編寫類似的東西

WHERE COUNT(remote_addr < 2) 
or 
GROUP BY customerid, remote_addr HAVING 'votes' < 2 

...所以,相同的IP地址不超過每家公司在最終結果中統計了一次。

什麼是SQL來做到這一點?

如果沒有sql,php/mysql中的最佳解決方案是什麼?

謝謝。

注意 雖然本報告跨越24小時,其他報告從12小時到30天的所有時間。

回答

0
SELECT whatever FROM (
    SELECT whatever FROM hit_company 
    WHERE hitstamp >= whatever 
    GROUP BY organization, remoteaddr 
) GROUP BY customerid ORDER BY count 

手寫未測試。基本思想是使用子查詢。如果對大數據進行計算,這將非常緩慢。