order-by-before-group-by-with-join

b4wnujal  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(432)

我的sql查询有问题。我想为用户显示最后一条消息。所以,我使用“groupby”方法,但他不显示最后一条消息。
这是我的第一个问题:

SELECT `messages`.*, `conversations`.* 
FROM `messages` JOIN `conversations` ON `conversations`.`cNUM` = `messages`.`mCONV_NUM` 
WHERE `cUSER2` = '2' 
GROUP BY `messages`.`mCONV_NUMn`

我试着遵循这个主题:在mysql中按名称分组之前按日期和时间排序(以及其他许多)
我有这个:

SELECT `messages`.*, `conversations`.* 
FROM (SELECT mTIME 
      FROM `messages` 
      ORDER BY mTIME desc) AS M 
JOIN `conversations` ON `conversations`.`cNUM` = `messages`.`mCONV_NUM` 
WHERE `cUSER2` = '2' 
GROUP BY `messages`.`mCONV_NUMn`

我有一个错误:表'messages'未知。
所以。。我需要你们的帮助

ve7v8dk2

ve7v8dk21#

你说你想要一个用户的最后一条消息,但似乎你真的想要几条消息,即他们参与的每一次对话的最后一条消息。
因为缺乏 CROSS APPLY 在mysql中,您需要一个执行大量查找的查询来获取每个会话的最后一条消息:

select *
from conversations c 
join messages m on m.mconv_num = c.cnum
where c.cuser2 = 2
and not exists 
(
  select * 
  from messages m2 
  where m2.mconv_num = m.mconv_num
  and m2.mtime > m.mtime
);
qojgxg4l

qojgxg4l2#

我想为用户显示最后一条消息。
您将为具有 LIMIT :

select *
from conversations c 
join messages m on m.mconv_num = c.cnum
where c.cuser2 = 2
order by m.mtime
limit 1;
j2cgzkjk

j2cgzkjk3#

您为messages表提供了一个别名m,正如isaace所说的,您应该在查询的其余部分将其称为“m”,因为这个临时名称在整个查询期间都有效,而from是查询处理的初始阶段。
我们讨论的是逻辑查询处理,这意味着在您的查询from语句中,首先计算并处理查询的其余部分。
在lqp术语中,查询将按以下顺序处理。
从-->其中-->分组依据-->具有-->选择-->排序依据
(当然我省略了一些阶段,但你明白了)
您还可以使用limit为用户获取最后一条消息。最后加上限制1。

相关问题