我有一个表格的用户接入会议记录的网站的访问者的活动:

accessid, userid, date, time, url

我想检索所有不同的会议userid1234,以及最早的日期和时间为每个这些不同的会议。

SELECT 
    DISTINCT accessid, 
    date, 
    time 
FROM 
    accesslog 
WHERE userid = '1234' 
GROUP BY accessid

这给我的日期和时间的一个随机排在每个不同的accessid.我读过一些员额推荐使用min()and 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

...但我永远不会得到正确的结果最早的日期和时间。

是什么把戏订购这种查询?

编辑

某事奇怪的发生。...

代码贴在下面通过的法案Karwin正确地检索最早的日期和时间的会议,开始在2009-09.但是,对于会议开始在某一天在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

...和我的猜测,唯一的原因的结果accessid2似乎是正确的,因为它没有命在前一个月。

我疯了吗?

编辑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 领域。

有帮助吗?

解决方案

这是一个变化的"最伟大的-n-每组"的问题涉及在计算器几次,每星期。

SELECT 
        a1.accessid, 
        a1.date, 
        a1.time 
FROM 
        accesslog a1
LEFT OUTER JOIN
        accesslog a2
  ON (a1.accessid = a2.accessid AND a1.userid = a2.userid
    AND (a1.date > a2.date OR a1.date = a2.date AND a1.time > a2.time))
WHERE a1.userid = '1234'
  AND a2.accessid IS NULL;

这种工作方式是,我们尝试找到排(a2)具有相同的accessid和用户名和一个较早的日期或时间比行a1。当我们找不到一个较早的排,然后必须a1 最早的排。


重新评论,我只是尝试过的样本数据的提供。这里就是我遇到:

+----------+------------+----------+
| accessid | date       | time     |
+----------+------------+----------+
|        1 | 2009-08-15 | 01:01:01 | 
|        2 | 2009-09-01 | 14:01:01 | 
+----------+------------+----------+

我使用的MySQL5.0.75在Mac OS X.

其他提示

试试这个

SELECT 
    accessid, 
    date, 
    time 
FROM 
    accesslog 
WHERE userid = '1234' 
GROUP BY accessid
HAVING MIN(date)

它将返回的所有独特的访问以最少的时间用于每个用户id='1234'.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top