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;