2013-02-04 46 views
1

我有3个表格:搜索多对多关系中的最新评论

帖子,帖子评论以及评论。

这是一个多对多的关系。

我想为每个帖子选择最后的评论。 所以像(选择*从评论秩序通过create_at DESC限制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 

它非常适用于一个一对多的关系,但我不能多到多得到这搭。

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

感谢您

+0

这是MySQL数据库? – sll

+0

你正在使用哪些DBMS?甲骨文? Postgres的? –

+0

我正在使用Postgres。 – lyrixx

回答

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 
1

您的查询的主表应该是postcomment,您可以通过组和帖子ID假设得到它是一个autoincrementid最大(postcomment)。

然后您只需将结果与其他表加入即可获得其余数据。 由于您可能需要从其他表中获取大量数据,为避免将所有这些数据添加到组中,我将使用CTE:

(CTE是一种sql server语法,如果您未使用SQL服务器,你将不得不使用另一种机制来存储这些临时数据)

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 
+0

我使用orm。所以我以“声明”为准。但是谢谢。 – lyrixx