我的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`
我有这个错误:表'消息'未知。
所以......我需要你帮助的人
答案 0 :(得分:0)
你给了你的留言表一个别名M,正如isaace所说,你应该把它称为' M'在查询的其余部分,因为此临时名称持续查询的整个持续时间, FROM是查询处理的初始阶段 。
我们正在谈论一种名为logical query processing的东西,这意味着在 最初评估和处理您的查询FROM语句 其余的查询。
在LQP条款中,查询将按以下顺序处理。
(当然我遗漏了一些阶段,但你明白了)
此外,您可以使用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;