mysql - 使用子查询进行奇怪的排序

标签 mysql sql sql-order-by

我有 SQL:

select
sub.id,
corr
from 
    (
        select
            m.id,
            m.sent_time,
            (case when m.to_user = '58' then m.from_user else m.to_user end) as corr
        from
            messages m
        where
            (
                from_user = '58' OR
                to_user = '58'
            )
        order by
            m.sent_time desc
    ) as sub
group by
    sub.corr
order by
    sent_time DESC

在我继承的一个网站的源代码中。 SQL 检索消息 ID 以及与登录用户发送消息或从登录用户发送消息的通信对方的用户 ID(在本例中为用户 ID 58)。

此时的查询始终返回用户 (58) 和另一个用户之间最旧的消息 ID。 通过使用 send_time DESC 更改顺序并没有改变这一点。

我可能遗漏了一些明显的东西 - 但是如何通过更改此查询来获取最新消息而不是最旧消息的消息 ID?

最佳答案

您的查询没有给出您想要的结果,因为一旦您使用GROUP BY,它就会为所有未聚合的列选择随机值。我认为你可以简化你的查询来避免这个问题:

SELECT id, 
    CASE WHEN to_user = '58' THEN from_user ELSE to_user END AS corr
FROM messages m
WHERE (to_user = 58 OR from_user = 58) AND
    sent_time = (SELECT MAX(sent_time) 
                 FROM messages m1 
                 WHERE m1.to_user = 58 OR m1.from_user = 58)

关于mysql - 使用子查询进行奇怪的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52776111/

相关文章:

php - 如何通过电子邮件登录显示用户名?

mysql - 根据另一个表的聚合更新表

mysql - mysql 查询中的多个 AND 条件

mysql - 在表之间插入?

sql - 按使用 case 表达式内的别名的计算列进行排序

mysql - 通过循环另一个表来创建新表

php - 手动更新 WordPress 数据库

SQL vs CODE,平衡点在哪里?

mysql - 使用不同的日期字段排序

mysql - ORDER BY 如何处理 MySQL 中的单值表达式?