Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何确定表中多个项目的第一个实例_Mysql_Sql - Fatal编程技术网

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

Mysql 如何确定表中多个项目的第一个实例,mysql,sql,Mysql,Sql,标题没有很好地描述这一点,但假设Mysql 5数据库中有以下简化表: access access_id | ip | date | browser --------------------------------------------- int | char(40) | date | varchar(255) 我如何通过忽略NAT路由和多人从同一ip访问,以及他们的浏览器在一个日期范围内访问站点,找到确定首次用户数量的最佳方法。即: SELEC

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

 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是互斥的。我非常确定我需要一个子查询,我只是担心我需要两个。。。谢谢需要注意的是,相关子查询的效率要高得多。