首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按前按组顺序与联接

问按前按组顺序与联接
EN

Stack Overflow用户
提问于 2018-01-18 14:17:37
回答 3查看 199关注 0票数 0

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

这是我的第一个查询:

代码语言:javascript
复制
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 (和很多其他的)

和我有一个:

代码语言:javascript
复制
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`

我有一个错误:表‘消息’未知。

所以..。我需要你的帮助,伙计们

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-18 14:42:58

你说你想要用户的最后一条消息,但似乎你真的想要几条消息,也就是他们参加的每一次对话的最后一条消息。

由于CROSS APPLY和MySQL中缺少窗口函数,您需要进行大量查找才能获得每次会话的最后一条消息:

代码语言:javascript
复制
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
);
票数 0
EN

Stack Overflow用户

发布于 2018-01-18 14:31:33

您为您的messages表提供了一个别名M,正如艾萨雷斯所说的,您将在查询的其余部分中将其称为“M”,因为这个临时名称将持续整个查询过程,而FROM是查询处理的初始阶段。

我们讨论的是名为https://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/的东西,这意味着在查询FROM语句中,首先对其进行评估和处理,然后再对其余的查询进行处理。

在LQP术语中,查询将按以下顺序处理。

  • 从-> WHERE -->按-->具有-> SELECT --> 的顺序分组

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

此外,您还可以使用极限来获取用户的最后一条消息。只需在末尾加限制1即可。

票数 1
EN

Stack Overflow用户

发布于 2018-01-18 14:45:59

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

您将获得最后一条使用LIMIT的用户消息

代码语言:javascript
复制
select *
from conversations c 
join messages m on m.mconv_num = c.cnum
where c.cuser2 = 2
order by m.mtime
limit 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48323396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档