使用GROUP BY的MySQL查询和使用ORDER BY的子查询

加文

我有一个消息表,每个消息都属于一个唯一的对话(conversation_id)。我想从每个对话中选择最新消息。

下面的查询有效,但是由于子查询选择了发送给用户的所有消息,因此效率似乎很低。

SELECT
    conversation_id,
    to_id,
    from_id,
    time_sent,
    type,
    message
FROM (
    SELECT
        *
    FROM
        messages
    WHERE
        to_id = :uid
    OR
        from_id = :uid
    ORDER BY
        time_sent
    DESC
)
AS
    t1
GROUP BY
    conversation_id
ORDER BY
    time_sent
DESC

如果仅包含一个,GROUP BY它将选择前(最旧)行:

SELECT
    conversation_id,
    to_id,
    from_id,
    time_sent,
    type,
    message
FROM
    messages
WHERE
    to_id = :uid
OR
    from_id = :uid
GROUP BY
    conversation_id

但是,当我这样做GROUP BYORDER BY在同一查询中时,它将返回每个对话的第一行(最旧),而不是最后一行,因此,该行ORDER BY不起作用或未达到我的预期。

SELECT
    conversation_id,
    to_id,
    from_id,
    time_sent,
    type,
    message
FROM
    messages
WHERE
    to_id = :uid
OR
    from_id = :uid
GROUP BY
    conversation_id
ORDER BY
    time_sent
DESC

我很确定我需要子查询,但是如何在不首先选择所有消息的情况下进行呢?

瓦莱克斯

尝试conversation_id为每个会话将表与带有和max(time_sent)的子查询联接:

SELECT
    m.conversation_id,
    m.to_id,
    m.from_id,
    m.time_sent,
    m.type,
    m.message
FROM messages as m
JOIN 
   (SELECT  conversation_id,
            MAX(time_sent) as MAX_time_sent
    FROM  messages
    WHERE to_id = :uid  OR from_id = :uid
    GROUP BY conversation_id
   ) AS t1
   ON m.conversation_id=t1.conversation_id AND m.time_sent = t1.MAX_time_sent

ORDER BY m.time_sent DESC

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用MySQL子查询和GROUP BY

来自分类Dev

保留子查询的顺序(使用GROUP BY和ORDER BY)

来自分类Dev

在mysql查询中正确使用group by和order by

来自分类Dev

使用GROUP BY和ORDER BY时间戳DESC的MySQL查询

来自分类Dev

使用GROUP BY和ORDER BY进行mysql查询的奇怪结果

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

结合使用MYSQL GROUP_CONCAT和子查询

来自分类Dev

结合使用MYSQL GROUP_CONCAT和子查询

来自分类Dev

使用GROUP BY的子查询中的MySQL COUNT

来自分类Dev

MySQL查询GROUP BY和ORDER by

来自分类Dev

使用内部联接和子查询的mysql查询

来自分类Dev

在SQL中的子查询中使用group by

来自分类Dev

使用linq group by语句作为子查询

来自分类Dev

在SQL中的子查询中使用group by

来自分类Dev

在查询中使用子查询

来自分类Dev

优化MySQL查询,该查询使用子查询;MariaDB更快

来自分类Dev

如何在子查询中使用多个 sum 和 group by?

来自分类Dev

如何在mysql中通过group by使用子查询?

来自分类Dev

MySQL中使用GROUP BY的子查询非常慢

来自分类Dev

在子查询Mysql中使用group concat的结果

来自分类Dev

使用LEFT JOIN(SELECT)ORDER和LIMIT的MySQL查询

来自分类Dev

如何在子查询中使用ORDER BY

来自分类Dev

使用子查询

来自分类Dev

INFORMIX使用子查询

来自分类Dev

使用子查询加入

来自分类Dev

使用 group by 和 order by 进行简单访问查询

来自分类Dev

使用案例和子查询MySql更新多个表

来自分类Dev

MySQL - 在 join 和 from 上使用子查询