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年11月10日,用户1访问但不是他们的第一次,所以返回0 在2013年10月10日,用户1和2第一次访问,所以返回2.
显然,使用简单查询可以计算指定日期的条目数,但是只有先前行中没有user_id时,才允许我使用什么方法。
该表按日期排序,这意味着更新的日期永远不应该具有比旧日期更小的ID。
任何想法?谢谢!
答案 0 :(得分: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
答案 1 :(得分: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
);
答案 2 :(得分:0)
SELECT user_id,MIN(date_tracked) FROM table_name GROUP BY user_id
答案 3 :(得分: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并且不必进行区分来更清晰。
答案 4 :(得分:0)
通过你的标签我假设你也希望你的答案在PHP中。 只有一个问题:不应该在10-10-2013返回3吗? 无论如何你可以试试这个:
<?php
$ dbConnect = @mysqli_connect($ host,$ user,$ pass)或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);
&GT;