标题没有很好地描述这一点,但假设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月之前没有访问过该网站的用户提供所有的it和浏览器--但是,如果一个用户在11月访问过该网站两次,它将计算两次,而我只想计算一次。我想我可以用另一个丑陋的subselect来解决这个问题,但我正在寻找执行查询的最佳方式,因为表中有很多行。
发布于 2012-02-09 01:04:12
据我所知,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)上建立索引
https://stackoverflow.com/questions/9197597
复制相似问题