如何选择使用SQL创建最新评论的帖子条目?

如何选择使用SQL创建最新评论的帖子条目?,sql,postgresql,join,greatest-n-per-group,Sql,Postgresql,Join,Greatest N Per Group,我有表post和comment,它们有外键(post\u id)要发布。我想得到100个“凹凸有序”的帖子条目。创建了最新注释条目的post条目位于第一位。我的第一次尝试是: SELECT * FROM post WHERE id IN ( SELECT DISTINCT post_id FROM comment ORDER BY created_time DESC LIMIT 100 ); 返回: 错误:对于SELECT DISTINCT,ORDER BY表达式必须出

我有表
post
comment
,它们有外键(post\u id)要发布。我想得到100个“凹凸有序”的帖子条目。创建了最新注释条目的post条目位于第一位。我的第一次尝试是:

SELECT * FROM post WHERE id IN
(
    SELECT DISTINCT post_id FROM comment
    ORDER BY created_time DESC
    LIMIT 100
);
返回:
错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中

第二次尝试:

SELECT * FROM post WHERE id IN
(
    SELECT post_id from
    (SELECT DISTINCT(post_id), posted FROM comment) AS c
    ORDER BY c.created_time DESC
    LIMIT 100
);

这次没有错误,但没有做我想做的。如何使SQL实现我想要的功能?

如果您希望选择包含最新评论的100篇文章,可以使用聚合:

select p.id, p.title, p.author
from posts p
inner join comments c on c.post_id = p.id
group by p.id, p.title, p.author
order by max(c.created_at) desc
limit 100
使用此技术,您需要枚举希望在
select
子句和
groupby
子句的结果集中看到的所有
posts

另一种选择是预聚合:

select p.*
from posts p
inner join (
    select post_id, max(created_at) max_created_at
    from comments 
    group by post_id 
    order by max(created_at) desc
    limit 100
) c on c.post_id = p.id
order by c.max_created_at desc

第一种方法对我有效,但第二种方法不行。但是一个就足够了,谢谢@霍兰德:第二个问题是什么?一个错误,错误的结果?没有错误,只是错误的结果,结果看起来像是按post id 1排序的max@RobertC.Holland:啊,是的,我明白了,在第二次查询中,我把
order by
分开了。固定的。