标题没有很好地描述,但假设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和浏览器 - 但如果用户在11月份访问过该网站两次,则会计算两次,我只想计算一次。我想我可以用另一个丑陋的子选项解决这个问题,但是我正在寻找执行查询的最佳方法,因为表中有很多行。
答案 0 :(得分: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)