Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择与Groupby中的条件匹配的第一行_Mysql_Group By - Fatal编程技术网

Mysql 选择与Groupby中的条件匹配的第一行

Mysql 选择与Groupby中的条件匹配的第一行,mysql,group-by,Mysql,Group By,给定以下消息表,其中频道是特定的聊天会话,user1和user2是聊天中的用户: +---------+-------+-------+------------+ | channel | user1 | user2 | message | +---------+-------+-------+------------+ | 5 | 15 | 8 | Hello | | 5 | 15 | 8 | I'm John | |

给定以下消息表,其中频道是特定的聊天会话,
user1
user2
是聊天中的用户:

+---------+-------+-------+------------+
| channel | user1 | user2 |  message   |
+---------+-------+-------+------------+
|       5 |    15 |     8 | Hello      |
|       5 |    15 |     8 | I'm John   |
|       5 |     8 |    15 | Hi John    |
|       6 |     9 |    15 | yo         |
|       6 |    15 |     9 | heyo       |
|       6 |     9 |    15 | you here?  |
|       8 |    15 |    10 | Hi         |
|       8 |    15 |    10 | you there? |
+---------+-------+-------+------------+
我想按
频道分组
,然后选择第一个响应行(第二个人说话的第一行)。如果第二个人从未像通道8中那样响应,那么他们就不需要出现在输出中

所以我的预期结果是:

+---------+-------+-------+---------+
| channel | user1 | user2 | message |
+---------+-------+-------+---------+
|       5 |     8 |    15 | Hi John |
|       6 |    15 |     9 | heyo    |
+---------+-------+-------+---------+

注意,有一个timestamp列,只是忘了包含它。任何帮助都将不胜感激,我们一直在寻找解决方案,但尚未找到任何解决方案。谢谢。

我自己并不完全相信。随时改进。 限制1依赖于每次自上而下读取的表格。 我怀疑所有不同的选择都可以做得更优雅。 但至少它给出了样本数据所需的结果:)


假设您有一个时间戳列,您可以获得第一条消息的
user2
,如下所示:

select m.*
from messages m
where not exists (select 1
                  from messages m2
                  where m2.channel = m.channel and
                        m2.timestamp < m.timestamp
                 );

您是否有
时间戳
id
字段来确定
顺序
?没有它,你就不能保证结果的顺序(以获得第二次对话)。是的,很抱歉。时间戳是可用的。哇-那太棒了!现在我只需要多花点时间真正理解它。谢谢戈登-后续问题。如果我也想选择响应的时间戳,我该怎么办?在select中添加m.timestamp并不能确保我获得该确切响应行的时间戳。@user3081257。只需包含
min(m.timestamp)
。好的,请将其删除。最小值(m.timestamp)有效。嗯。再次感谢!
select m.*
from messages m
where not exists (select 1
                  from messages m2
                  where m2.channel = m.channel and
                        m2.timestamp < m.timestamp
                 );
select m.channel, m.user1, m.user2,
       substring_index(group_concat(m2.messages order by m2.timestemp separator '|'), '|', 1)
from messages m join
     (select m.*
      from messages m
      where not exists (select 1
                        from messages m2
                        where m2.channel = m.channel and
                              m2.timestamp < m.timestamp
                       )
     ) mfirst
     on m.channel = mfirst.channel and
        m.user1 = mfirst.user2
group by m.channel, m.user1, m.user2;