Получить условно последнюю запись из каждой группы - без агрегатных функций или разделов - PullRequest
2 голосов
/ 29 января 2020

Я пытался сделать это разными способами.

Примечание: нам не нужна агрегатная функция или раздел, поскольку это лишь малая часть всей хранимой процедуры, и это Требуется ли у клиента его отсутствие, поэтому нет возможности и невозможно дублировать другие существующие ответы / вопросы

У меня есть таблица сообщений, в которой есть столбец from и to, внешний ключ для пользовательская таблица, в основном которую пользователь отправляет кому по простейшему. У меня также есть другие столбцы, которые isSnoozed и snoozeAt, если сообщение откладывается.

Таким образом, порядок в соответствии с регистром. Если сообщения откладываются, рассмотрите возможность snoozeAt для заказа или, если нет, то рассмотрите sendAt. (сейчас мы можем игнорировать это условие при оформлении заказа, но я упомянул об этом, поскольку мы не можем просто принять MAX(id))

Мне нужно получать последние сообщения из группы сообщений от идентификатора пользователя таблица сообщений типа:

id -- to -- from -- isSnoozed -- snoozedAt -- sendAt ...

Что я пробовал:

select * from ( select * from messages order by sendAt DESC) as TEMP GROUP BY TEMP.from

Я пробовал много похожих подходов, но ни один из них не работал. Я потратил много платных часов, но не могу найти подход, который точно соответствует моему требованию

ПРИМЕЧАНИЕ: Пожалуйста, игнорируйте опечатку в запросе, если есть, так как я не могу набрать точную таблицу запросов и имена, Поэтому я набрал прямо здесь

Ответы [ 2 ]

1 голос
/ 29 января 2020

Я понял это, выполнив что-то вроде этого, что можно объяснить в упрощенном виде:

select * from message where message.id in ( 
    select 
        ( select id from message where message.from = user.id order by CASE isSnoozed WHEN 0 THEN sendAt ELSE snoozeAt END DESC limit 1) as id
    from user where user.id in ( select friends.`whoIsAdded` from friends where friends.`whoAdded` = myId)
 ) order by CASE isSnoozed WHEN 0 THEN sendAt ELSE snoozeAt END DESC
0 голосов
/ 29 января 2020

Если я правильно понимаю, вы просто хотите наибольшее значение в одном из двух столбцов. Предполагая, что значения никогда не равны NULL, вы можете использовать greatest():

select m.*
from messages m
where greatest(m.sendAt, m.snoozedAt) =
          (select max(greatest(m2.sendAt, m2.snoozedAt))
           from messages m2
           where m2.from = m.from
          );

Если столбцы могут быть NULL, то вы можете использовать coalesce(), чтобы дать им более разумные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...