Mysql SQL顺序分组行

Mysql SQL顺序分组行,mysql,sql,group-by,Mysql,Sql,Group By,我有一张“信息”表。可能有常规消息或广告。每条消息都属于房间。 我需要按每个房间的日期获取最后一条消息,在这个选项中,必须是在第一次遇到类型为“ad”的消息之前,每个常规消息(type=msg)的计数,因为消息的顺序是递减的 Expected可能会更好地解释我需要什么: +------+------+------+------------+ | id | room | type | created_at | +------+------+------+------------+ | 8214

我有一张“信息”表。可能有常规消息或广告。每条消息都属于房间。 我需要按每个房间的日期获取最后一条消息,在这个选项中,必须是在第一次遇到类型为“ad”的消息之前,每个常规消息(type=msg)的计数,因为消息的顺序是递减的

Expected可能会更好地解释我需要什么:

+------+------+------+------------+
| id   | room | type | created_at |
+------+------+------+------------+
| 8214*|   83 | msg* | 1571726466 |
| 8213 |   83 | msg* | 1571724983 |
| 8212 |   83 | ad   | 1571724982 |
| 8211 |   83 | msg  | 1571724978 |
| 8210 |   83 | msg  | 1570861659 |
| 8209 |   83 | msg  | 1570861656 |
| 8208 |   83 | msg  | 1570861650 |
| 8207 |   83 | ad   | 1570861643 |
| 8206 |   83 | msg  | 1570861632 |
| 8255*|   82 | msg* | 1571732235 |
| 8254 |   82 | msg* | 1571732235 |
| 8253 |   82 | msg* | 1571732235 |
| 8252 |   82 | msg* | 1571732235 |
| 8251 |   82 | msg* | 1571732234 |
| 8250 |   82 | ad   | 1571732234 |
| 8249 |   82 | msg  | 1571732234 |
| 8248 |   82 | msg  | 1571732234 |
| 8247 |   82 | msg  | 1571732234 |
| 8246 |   82 | msg  | 1571732234 |
| 8245 |   82 | msg  | 1571732233 |
| 8244 |   82 | msg  | 1571732233 |
| 8243 |   82 | msg  | 1571732233 |
| 8242 |   82 | ad   | 1571732232 |
| 8241 |   82 | msg  | 1571732232 |
| 8240 |   82 | msg  | 1571732232 |
| 8239 |   82 | msg  | 1571732231 |
| 8238 |   82 | msg  | 1571732231 |
| 8237 |   82 | ad   | 1571732231 |
| 8236 |   82 | msg  | 1571732231 |
| 8235 |   82 | msg  | 1571732231 |
| 8234 |   82 | msg  | 1571732230 |
| 8233 |   82 | msg  | 1571732230 |
| 8232 |   82 | msg  | 1571732230 |
| 8231 |   82 | msg  | 1571732230 |
| 8230 |   82 | msg  | 1571732230 |
| 8229 |   82 | msg  | 1571732229 |
| 8228 |   82 | msg  | 1571732228 |
| 8227 |   82 | msg  | 1571732228 |
| 8226 |   82 | msg  | 1571732228 |
| 8225 |   82 | msg  | 1571732227 |
| 8224 |   82 | msg  | 1571732227 |
| 8223 |   82 | ad   | 1571732227 |
| 8222 |   82 | msg  | 1571732226 |
| 8221 |   82 | msg  | 1571732223 |
| 8220 |   82 | msg  | 1571732223 |
在源代码中,我用“*”标记了哪些行应该在结果中计数/显示

如果语法错误,对不起


UPD:在创建相同的\u的情况下,我想它也应该按id desc排序。

从您的预期输出来看,您似乎需要在最后一个广告出现后的所有消息行。这可以通过使用子查询轻松实现-

+------+------+------+------------+-----------+
| id   | room | type | created_at | count_msg |
+------+------+------+------------+-----------+
| 8214 |   83 | msg  | 1571726466 | 2         |
| 8255 |   82 | msg  | 1571732235 | 5         |
+------+------+------+------------+-----------+

是小提琴。

您似乎想要在最后一个
'ad'
之后的所有消息——至少基于您的数据

我考虑使用相关子查询和聚合进行过滤:

SELECT MAX(T1.id), T1.room, type, MAX(created_at), COUNT(*) count_msg
FROM YOUR_TABLE T1
JOIN (SELECT MAX(id) id, room
      FROM YOUR_TAB
      WHERE type = 'ad'
      GROUP BY room) T2 ON T1.id > T2.id AND T1.room = T2.room
GROUP BY room, type

这个问题似乎根本不包括任何解决问题的尝试。请编辑问题以显示您尝试了什么,并显示您遇到的具体障碍。有关更多信息,请参阅。@Andreas我无法显示我尝试过的所有内容。我的意思是,按房间添加组和按创建的订单非常简单,但如何根据需要的条件计算选择我根本不知道。我甚至不知道如何正确地在谷歌上搜索它。它是在你想要的输出中创建的,总是第一条消息还是你不在乎?@P.Salmon好吧,我想是的。我不仅需要我的具体计数,还需要这个序列中的最后一条消息。顺便说一句,你刚才提醒我,我还需要按id排序,以防创建的_at是相同的。谢谢。让我们再试一次:看:
select t2.room, max(t.id), t.type, max(t.created_at), count(*)
from t
where t.id > (select max(t2.id)
              from t t2
              where t2.room = t.room and t2.type = 'ad'
             )
group by t.room, t.type;