我有一个记录网站访问者活动的用户访问会话表:
accessid, userid, date, time, url
我正在尝试检索用户 ID 1234 的所有不同会话,以及每个不同会话的最早日期和时间。
SELECT
DISTINCT accessid,
date,
time
FROM
accesslog
WHERE userid = '1234'
GROUP BY accessid
这给了我每个不同 accessid 中随机行的日期和时间。我已经阅读了许多推荐使用 min() 和 max() 的帖子,所以我尝试了:
SELECT DISTINCT accessid, MIN(DATE) AS date, MIN(TIME) AS time FROM accesslog WHERE userid = '1234' GROUP BY accessid ORDER BY date DESC, time DESC
... 乃至...
SELECT DISTINCT accessid, MIN(CONCAT(DATE, ' ', TIME)) AS datetime FROM accesslog WHERE userid = '1234' GROUP BY accessid ORDER BY date DESC, time DESC
...但我从来没有得到最早日期和时间的正确结果。
订购这种查询的技巧是什么?
编辑 -
奇怪的事情正在发生......
Bill Karwin 在下面发布的代码正确检索了 2009 年 9 月开始的会话的最早日期和时间。但是,对于在 2009-08 的某一天开始的会话,返回的是当月发生的第一次点击的时间和日期。换句话说,查询似乎没有跨越几个月!
示例数据集:
accessid | userid | date | time
1 | 1234 | 2009-08-15 | 01:01:01
1 | 1234 | 2009-09-01 | 12:01:01
1 | 1234 | 2009-09-15 | 13:01:01
2 | 1234 | 2009-09-01 | 14:01:01
2 | 1234 | 2009-09-15 | 15:01:01
至少在我的实际数据表中,下面发布的查询会为两个 accessid 中的每一个找到以下最早的日期和时间:
accessid | userid | date | time
1 | 1234 | 2009-09-01 | 12:01:01
2 | 1234 | 2009-09-01 | 14:01:01
...而且我猜想 accessid 2 的结果显示正确的唯一原因是因为它在上个月没有命中。
我要疯了吗?
编辑 2 -
答案是肯定的,我要疯了。当放置在重复结构的表中时,该查询适用于上述示例数据。
这是(截断的)原始数据。我包括了第一次点击,同一个月的另一次点击,下个月的第一次点击,然后是本月的最后一次点击。原始数据集在这些点之间有更多的命中,总共 462 行。
accessid | date | time
cbb82c08d3103e721a1cf0c3f765a842 | 2009-08-18 | 04:01:42
cbb82c08d3103e721a1cf0c3f765a842 | 2009-08-23 | 23:18:52
cbb82c08d3103e721a1cf0c3f765a842 | 2009-09-17 | 05:12:16
cbb82c08d3103e721a1cf0c3f765a842 | 2009-09-18 | 06:29:59
... 查询返回 2009-09-17 值作为查询原始表时的最早值。但是,当我复制........哦,球。
这是因为 2009-08% 的命中有一个空白userid
字段。