在GROUP BY之前使用JOIN进行ORDER BY

时间:2018-01-18 14:17:37

标签: mysql sql sql-order-by

我的SQL查询有问题。我想为用户显示最后一条消息。所以,我使用方法“GROUP BY”但他没有显示最后的消息。

这是我的第一个问题:

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

我尝试遵循这个主题:ORDER BY date and time BEFORE GROUP BY name in 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`

我有这个错误:表'消息'未知。

所以......我需要你帮助的人

3 个答案:

答案 0 :(得分:0)

你给了你的留言表一个别名M,正如isaace所说,你应该把它称为' M'在查询的其余部分,因为此临时名称持续查询的整个持续时间, FROM是查询处理的初始阶段

  

我们正在谈论一种名为logical query processing的东西,这意味着在   最初评估和处理您的查询FROM语句   其余的查询。

在LQP条款中,查询将按以下顺序处理。

  • FROM - >在哪里 - > GROUP BY - > HAVING - >选择 - >订购

(当然我遗漏了一些阶段,但你明白了)

此外,您可以使用LIMIT获取用户的最后一条消息。 只需在最后添加LIMIT 1.

答案 1 :(得分:0)

你说你想要一个用户的最后一条消息,但似乎你真的想要几条消息,即他们参与的每个对话的最后一条消息。

由于MySQL中缺少CROSS APPLY和窗口函数,您需要一个查询来执行大量查找以获取每个对话的最后一条消息:

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
);

答案 2 :(得分:0)

  

我想显示用户的最后一条消息。

您收到LIMIT的用户的最后一条消息:

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