子查询的排序奇数

时间:2018-10-12 09:10:04

标签: 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?

2 个答案:

答案 0 :(得分:1)

您的查询没有提供您想要的结果,因为一旦您使用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)

答案 1 :(得分:0)

如果我了解您的意思,则可以尝试使用以下sql:

select
max(sub.id),
sub.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