Mysql 在没有最小值概念的情况下,如何选择每组中第一行对应的记录?

Mysql 在没有最小值概念的情况下,如何选择每组中第一行对应的记录?,mysql,group-by,Mysql,Group By,我的表遵循以下结构 +--------+---------+---------------------+--------------------+ | userId | loginId | tstamp | action | +--------+---------+---------------------+--------------------+ | 134088 | NE78MEZ | 2014-10-31 13:59:33 | pagev

我的表遵循以下结构

+--------+---------+---------------------+--------------------+
| userId | loginId | tstamp              | action             |
+--------+---------+---------------------+--------------------+
| 134088 | NE78MEZ | 2014-10-31 13:59:33 | pageview           |
| 134088 | NE78MEZ | 2014-10-31 13:59:53 | pageview           |
| 134088 | NE78MEZ | 2014-10-31 14:00:26 | pageview           |
| 134088 | NE78MEZ | 2014-10-31 14:00:28 | pageview           |
| 134088 | 9T3CgQ7 | 2014-10-31 14:33:27 | pageview           |
| 134088 | 9T3CgQ7 | 2014-10-31 14:33:27 | pageview           |
| 134088 | 9T3CgQ7 | 2014-10-31 14:46:47 | pageview           |
| 134088 | tq69c8F | 2014-10-31 15:09:02 | pageview           |
| 134088 | tq69c8F | 2014-10-31 15:09:40 | ask                |
| 134088 | tq69c8F | 2014-10-31 15:10:34 | tag                |
| 134088 | tq69c8F | 2014-10-31 15:10:38 | tag                |
| 134088 | tq69c8F | 2014-10-31 15:10:45 | tag                |
| 134088 | tq69c8F | 2014-10-31 15:10:59 | rating             |
| 134088 | tq69c8F | 2014-10-31 15:11:09 | rating             |
| 134088 | tq69c8F | 2014-10-31 15:11:12 | pageview           |
| 134088 | tq69c8F | 2014-10-31 15:11:20 | tag                |
| 134088 | tq69c8F | 2014-10-31 15:11:29 | tag                |
| 134088 | tq69c8F | 2014-10-31 15:13:55 | rating             |
+--------+---------+---------------------+--------------------+
对于每个用户(在下面的示例中我只有一个用户),我有不同的登录ID,这些ID是随机生成的,代表不同的登录会话。对于这种随机生成的字符串,最小值(loginId)的概念没有意义。但是对于每个用户,我想选择与第一个loginId对应的所有记录

因此,我希望输出类似于:

+--------+---------+---------------------+--------------------+
| userId | loginId | tstamp              | action             |
+--------+---------+---------------------+--------------------+
| 134088 | NE78MEZ | 2014-10-31 13:59:33 | pageview           |
| 134088 | NE78MEZ | 2014-10-31 13:59:53 | pageview           |
| 134088 | NE78MEZ | 2014-10-31 14:00:26 | pageview           |
| 134088 | NE78MEZ | 2014-10-31 14:00:28 | pageview           |
对于用户ID为134088的用户,后跟列表中的下一个用户

我能想到的一种方法是创建一个名为sessionid的列,它是随机生成的loginId的“数字”版本,并使用
wheresession=1
groupbyuserid
子句。有没有一种方法可以让我在不创建此冗余列的情况下四处走动


我正试图在mysql中实现这一点,您可以通过查找最小时间戳,然后选择与此相关的所有登录名来实现这一点。使用窗口/分析函数会更容易,但在MySQL中:

select t.*
from mytable t join
     (select t2.userid, substring_index(group_concat(t2.loginid order by timestamp), ',', 1) as firstlogin
      from mytable t2
      group by t2.userid
     ) t2
     on t.userid = t2.userid and t.login = t2.firstlogin;
子字符串\u index()
/
组\u concat()
是MySQL中获取与第一个时间戳关联的登录名的一个技巧。这将节省一些额外的
连接逻辑或必须使用变量