2013-02-05 78 views
0

我有两个表'评论'和'喜欢',我可以显示所有已被喜欢的评论,并在添加评论时排序。我目前无法做的事情是按照他们喜欢的时间排列评论。MySQL EXISTS和ORDER BY

这是我的时刻:

SELECT * 
FROM comments AS c 
WHERE EXISTS (
    SELECT * 
    FROM likes AS l 
    WHERE c.commentID=l.commentID) 

谁能帮我用SQL以示与这就是一个最近喜欢先等等,以便在评论...

只需添加 - 我只想显示评论一次,并避免显示任何未被喜欢的评论。

+0

当你添加一个类似的东西时,你的时间戳是什么? –

+0

有没有存储日期时间的列? –

+0

道歉是的 - 我有一个列存储日期(作为datetime数据类型)在两个表中。 – tommyd456

回答

3

如果您有多个喜欢对一个给定的评论,那么你就需要聚集,如:

SELECT c.* 
FROM comments c join 
    (select l.commentId, MIN(likedate) as FirstLikeDate, MAX(likedate) as MaxLikeDate 
     from likes l 
     group by l.commentId 
    ) l 
    on c.commentId = l.CommentId 
order by MaxLikeDate desc 
+2

这可能比jmillroy的答案更有效率。加入前分组意味着一个较小的交叉产品。 – Barmar

+2

@Barmar。 。 。更Not论我憎恶在'select'子句中使用隐藏列的查询,除非绝对必要。 –

+0

有关效率的其他观点?我当然想用最有效的方法,但jmilloy的答案运作良好。我应该改为这个代码吗? – tommyd456

4

您想加入表格。

SELECT comments.* 
FROM comments JOIN likes ON comments.commentID = likes.commentID 
GROUP BY comments.commentID 
ORDER BY MAX(likes.date) DESC; 

JOIN使得行具有来自评论和喜欢的所有字段。如果您使用LEFT JOIN它将包含尚未被喜欢的评论,但使用普通JOIN应该做你想做的。

GROUP BY折叠行,所以每个评论只有一行。

ORDER BY以相似的日期排序行。我使用了MAX(likes.date),因为每个评论的日期可能会很多,并且您想选择特定的日期。你也可以尝试MIN(likes.date),这取决于你在找什么(最近喜欢vs第一个喜欢)。

+0

+1击败我吧...... :)您可能想在最近的排序顺序上添加一个“DESC”。 –

+0

嗨 - 是的,如果他们多次被喜欢,它会多次显示评论。我只想显示评论一次。 – tommyd456

+1

@ tommyd456嗯,不,分组(通过编辑添加)会使它们只显示一次。 –

0

由于您只想证明有这样的评论,你可以这样做:

SELECT * FROM comments INNER JOIN likes USING(commentID) ORDER BY like_date DESC; 
+0

如果评论已被多次浏览,则会多次显示评论。 –