如何确定表中多个项的第一个实例

时间:2012-02-08 16:39:34

标签: mysql sql

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

1 个答案:

答案 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)

上设置索引