我尝试返回按created_at desc排序的表中user_id(1)的所有消息,但是按照sender_id或recipient_id对其进行分组,具体取决于created_at是否为较新的。
messages
sender_id | recipient_id | text | created_at
1 | 2 | hey | 2017-03-26 04:00:00
1 | 2 | tees | 2017-03-26 00:00:00
2 | 1 | rrr | 2017-03-27 00:00:00
3 | 1 | edd | 2017-03-27 00:00:00
1 | 3 | cc3 | 2017-02-27 00:00:00
理想情况下会返回
2 | 1 | rrr | 2017-03-27 00:00:00
1 | 3 | cc3 | 2017-02-27 00:00:00
我到目前为止的查询是 -
select *
from messages
where (
sender_id = 1
or recipient_id = 1
)
group by least(sender_id, recipient_id)
order by created_at desc
但它似乎是在小组之前按顺序排序。
任何帮助都会很有意义。
答案 0 :(得分:0)
GROUP BY
用于聚合(总和,计数等等),它的命令仅仅是官方的副作用(在不同的版本中被弃用,并且不保证行为) 。 ORDER BY
在GROUP BY
之后完成,它对最终结果进行排序,并且可以采用多个表达式。您对这些术语的可互换使用使得很难准确理解您正在寻找的内容,但是通过样本期望的结果可能是这样:
ORDER BY LEAST(sender_id, recipient_id), created_at DESC
但是,由于示例结果中的所有行都具有相同的“LEAST”值,因此可能是:
ORDER BY LEAST(sender_id, recipient_id), created_at DESC
答案 1 :(得分:0)
如果您尝试获取用户1的最新帖子,他们是发件人,而用户1的最新帖子是收件人。
我会在第一个查询中将最新帖子作为发件人进行联合,第二个将最新帖子作为收件人。
select *
from messages
join
(
select
sender_id,
max(created_at) as max1
from messages
where
sender_id = 1
group by
sender_id
) t1
on messages.created_at = t1.max1
union
select *
from messages
join
(
select
recipient_id,
max(created_at) as max2
from messages
where
recipient_id = 1
group by
recipient_id
) t2
on messages.created_at = t2.max2