【问题标题】:ORDER BY before GROUP BY with JOINORDER BY 在 GROUP BY 之前使用 JOIN
【发布时间】:2018-06-27 15:35:27
【问题描述】:

我的 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`

我有这个错误:Table 'messages' unknown.

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

【问题讨论】:

  • 在第二个查询中,你给消息一个别名 M,所以你应该把它称为 M 而不是消息。
  • 无论如何,表中的行(包括派生表,即子查询)被认为是无序的。所以你的ORDER BY 毫无意义。你的 DBMS 是什么?这通常通过窗口函数或CROSS APPLY 解决。从我认为这是 MySQL 的丑陋反引号来看? MySQL 不支持这两种方法。

标签: mysql sql sql-order-by


【解决方案1】:

您为您的消息表提供了一个别名 M,正如 isaace 所说,您应在查询的其余部分将其称为“M”,因为此临时名称在整个查询期间持续存在,并且 FROM 是查询处理的初始阶段

我们正在谈论一个叫做logical query processing的东西,这意味着在 您的查询 FROM 语句最初被评估和处理,并且 然后是查询的其余部分。


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

  • FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY

(当然我省略了一些阶段,但你明白了)

您还可以使用 LIMIT 来获取用户的最后一条消息。 只需在末尾添加 LIMIT 1。

【讨论】:

    【解决方案2】:

    您说您想要给用户的最后一条消息,但您似乎确实想要多条消息,即他们参与的每个对话的最后一条消息。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 嗨。感谢您的回复。我想要用户是“user2”的所有对话中的最后一条消息。不止一个
      • 那看我的其他回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 2014-08-31
      • 2014-01-30
      • 2016-04-03
      • 2014-12-24
      相关资源
      最近更新 更多