2012-02-08 38 views
2

標題不描述這個非常好多個項目的第一個實例,但假設在MySQL 5數據庫以下簡化表:如何確定表中

access 

access_id | ip  | date | browser 
--------------------------------------------- 
int  | char(40) | date | varchar(255) 

如何找到最優確定第一次用戶的數量(通過IP忽略NAT路由和多個來自相同IP的訪問的人)以及他們的瀏覽器在日期範圍之間訪問該站點。即:

SELECT count(browser), browser 
    FROM access 
WHERE date > '2011-11-1' AND date < '2011-12-1' 
AND ip NOT IN (SELECT ip FROM access WHERE date < '2011-11-1') 
GROUP BY browser 

會給我所有誰2011年11月之前沒有看過該網站的IPS和瀏覽器爲用戶 - 但如果用戶訪問了該網站在十一月兩次會指望他們兩次,我只想要數一次。我想我可以用另一個醜陋的子查詢來解決這個問題,但是我正在尋找執行查詢的最佳方法,因爲表中有許多行。

+0

索引我沒有在時刻訪問數據庫,但我相信你嘗試了SELECT DISTINCT(IP)和沒有工作? – codemonkey 2012-02-08 16:46:33

+0

DISTINCT和GROUP BY是互斥的。 – 2012-02-08 17:04:33

回答

1

據我所知,MySQL能夠僅此使用相關子查詢,或加入一個子查詢做...


相關 - 子查詢:

SELECT 
    count(browser), browser 
FROM 
    access 
WHERE 
     date = (SELECT MIN(date) FROM access AS lookup WHERE ip = access.ip) 
    AND date > '2011-11-1' 
    AND date < '2011-12-1' 
GROUP BY 
    browser 


子查詢:

SELECT 
    count(access.browser), access.browser 
FROM 
    (SELECT ip, MIN(date) AS date FROM access GROUP BY ip) AS lookup 
INNER JOIN 
    access 
    ON access.ip = lookup.ip 
    AND access.date = lookup.date 
WHERE 
     lookup.date > '2011-11-1' 
    AND lookup.date < '2011-12-1' 
GROUP BY 
    access.browser 

無論哪種方式,被起訴到對(ip, date)

+0

我很確定我需要一個子查詢,我只是擔心我需要兩個......謝謝! – 2012-02-08 17:22:06

+0

只需注意,相關子查詢效率更高。 – 2012-02-08 17:55:29