Mysql 如何确定表中多个项目的第一个实例
标题没有很好地描述这一点,但假设Mysql 5数据库中有以下简化表:Mysql 如何确定表中多个项目的第一个实例,mysql,sql,Mysql,Sql,标题没有很好地描述这一点,但假设Mysql 5数据库中有以下简化表: access access_id | ip | date | browser --------------------------------------------- int | char(40) | date | varchar(255) 我如何通过忽略NAT路由和多人从同一ip访问,以及他们的浏览器在一个日期范围内访问站点,找到确定首次用户数量的最佳方法。即: SELEC
access
access_id | ip | date | browser
---------------------------------------------
int | char(40) | date | varchar(255)
我如何通过忽略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月之前未访问过该网站的用户提供所有IP和浏览器-但是,如果用户在11月访问过该网站两次,则会计算两次,我只想计算一次。我想我可以用另一个难看的子选择来解决这个问题,但我正在寻找执行查询的最佳方式,因为表中有很多行。据我所知,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
子查询:
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我目前没有访问数据库的权限,但我假设您尝试了SELECT Differentip,但没有成功?Differentic和GROUP BY是互斥的。我非常确定我需要一个子查询,我只是担心我需要两个。。。谢谢需要注意的是,相关子查询的效率要高得多。