1

我有 3 张桌子:

发布、发布评论和评论。

这是一个多对多的关系。

我想为每个帖子选择最后一条评论。所以像 (select * from comment order by create_at DESC limit 1) 这样的东西在这里不起作用。

我想要类似的东西:

select *
  from post as p
    left join post_comment as pc on (pc.post_id = p.id)
    left joint comment as c on (c.id = pc.comment_id)
    left joint comment as c2 on (c2.id = pc.comment_id and c2.id > c.id)
  where c2.id is null

它适用于一对多关系,但对于多对多,我无法驾驭它。

注意:我重命名了我的表。在我的代码中,我不使用评论和发布。我确实需要一个多对多的关系。

谢谢

4

2 回答 2

1

您查询的主表应该是 postcomment,您可以按 postid 分组并获取 max(postcomment),假设它是一个 autoincrementid。

然后您只需将结果与其他表连接起来即可获取其余数据。由于您可能需要来自其他表的大量数据,并且为了避免将所有这些数据添加到 group by,我将使用 CTE:

(CTE 是一种 sql server 语法,如果您不使用 sql server,则必须使用另一种机制来存储此临时数据)

with my_cte as
(
    select idpost, max(idcomment)  as last_comment_id
    from postcomment pc 
    group by idpost
)
select *
from my_cte 
     join post p on p.idpost=my_cte.idpost
     join comment c on c.idcomment=my_cte.last_comment_id
于 2013-02-04T10:49:40.510 回答
0

我做了类似的事情:

select *
  from post as p
    left join post_comment as pc on (pc.post_id = p.id)
    left join comment as c on (c.id = pc.comment_id)
    left outer join
            (post_comment as pc2
                inner join comment as c2 on (c2.id = pc2.comment_id)
            ) on (bc2.post_id = p.id and c1.created_at < c2.created_at)
  where c2.id is null
于 2013-02-04T11:00:37.193 回答