1
  id          | user_id        |      date_tracked
---------------------------------------------
 1001         |  1             | 10-10-2013
 1002         |  2             | 10-10-2013
 1003         |  3             | 10-10-2013
 1004         |  1             | 10-11-2013
 1005         |  2             | 10-12-2013

我有一个类似的表,它跟踪用户和日期。我需要找出在选定日期发生了多少用户首次条目。该表将保存大量数据,这就是为什么我想依靠查询而不是一堆 PHP 循环来处理它。

即 2013 年 10 月 11 日,用户 1 访问但不是他们第一次访问,所以在 2013 年 10 月 10 日返回 0,用户 1 和 2 第一次访问,所以返回 2。

显然,使用简单的查询可以计算指定日期的条目数,但是如果 user_id 不存在于之前的行中,什么方法将允许我只计算。

该表是按日期排序的,这意味着最近的日期不应具有比旧日期小的 id。

有任何想法吗??谢谢!

4

5 回答 5

3

按用户查找所有“第一次”日期:

SELECT user_id, MIN(date_tracked) AS first_date
FROM table
GROUP BY user_id

计算“第一次”,对于每个日期:

SELECT t.first_date, COUNT(*) AS nb
FROM (SELECT user_id, MIN(date_tracked) AS first_date
FROM table
GROUP BY user_id) t
GROUP BY t.first_date
于 2013-10-24T17:33:47.760 回答
1

作为对菲利普的回应,

也许这会更合适?

SELECT COUNT(*)
FROM table t1
WHERE t1.date ='2013-8-27'
AND NOT EXISTS (
SELECT 1
FROM table t2
WHERE t2.user_id = t1.user_id
  AND t2.id < t1.id
);
于 2013-10-25T14:59:51.473 回答
0

通过您的标签,我假设您也希望在 php 中得到答案。只需一个查询:日期 10-10-2013 不应该返回 3 吗?无论如何,你可以试试这个:

<?php

$dbConnect = @mysqli_connect($host, $user, $pass) or die();

@mysqli_select_db($dbConnect, $dbname) or die();
$query = "SELECT id FROM tablename WHERE date_tracked = '$searchDate' AND (SELECT COUNT(id) FROM tablename WHERE date_tracked < '$searchDate')=0";
$queryResult = @mysqli_query($dbConnect, $query) or die();
$rowCount = mysqli_num_rows($queryResult);
echo $rowCount . "<br/>";

mysqli_close($dbConnect);

?>

于 2013-10-24T19:25:41.147 回答
0

计为一个,如果用户在第一天访问了多次,你可以通过两种方式进行:

SELECT COUNT(distinct user_id)
FROM user t1
WHERE t1.date_tracked = '2013-10-12' 
AND NOT EXISTS (
    SELECT 1
    FROM user t2
    WHERE t2.user_id = t1.user_id
      AND t2.date_tracked < t1.date_tracked
    );

SELECT COUNT(user_id)
FROM user t1
WHERE t1.date_tracked ='2013-10-12'
AND NOT EXISTS (
SELECT 1
  FROM user t2
  WHERE t2.user_id = t1.user_id
    AND t2.id < t1.id
);

我认为我更喜欢第二个,因为通过比较 ID 而不必做不同的,它更干净。

sqlfiddle demo

于 2013-10-24T17:36:48.927 回答
0

SELECT user_id, MIN(date_tracked) FROM table_name GROUP BY user_id

于 2013-10-24T17:36:01.037 回答