Странность заказа с подзапросами - PullRequest
0 голосов
/ 12 октября 2018

У меня есть 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 извлекает идентификатор сообщения и идентификатор пользователя другой стороны, с которой было отправлено сообщение, куда сообщения были отправлены зарегистрированному пользователю или от него (в данном случае идентификатор пользователя 58.

В данный момент запрос всегда возвращаетсамый старый идентификатор сообщения между пользователем (58) и другим пользователем. Изменение порядка для использования sent_time DESC не изменило это.

Возможно, мне не хватает чего-то очевидного - но как я могу получить идентификатор сообщенияизменив этот запрос, а не самое старое сообщение?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Ваш запрос не дает желаемых результатов, потому что, как только вы используете 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)
0 голосов
/ 12 октября 2018

Если я понимаю, что вы имеете в виду, вы можете попробовать следующий 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
...