首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定表中多个项的第一个实例

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

Stack Overflow用户
提问于 2012-02-09 00:39:34
回答 1查看 146关注 0票数 2

标题没有很好地描述这一点,但假设Mysql 5数据库中的以下简化表:

代码语言:javascript
复制
 access

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

如何找到最佳方法来确定首次用户的数量(通过ip忽略NAT路由和来自同一IP的多人访问),以及他们在某个日期范围内访问站点的浏览器的数量。即:

代码语言:javascript
复制
 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来解决这个问题,但我正在寻找执行查询的最佳方式,因为表中有很多行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-09 01:04:12

据我所知,MySQL只能使用相关子查询或连接子查询...

相关-子查询:

代码语言:javascript
复制
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

子查询:

代码语言:javascript
复制
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)上建立索引

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9197597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档