2012-07-05 114 views
7

我有一张用来保存用户注释的表,我想检索每个用户所做的最后一条评论。下面从多对多的数据库关系中获取数据

查询应该给ü的什么,我试图做

select comment, comment_id, userId FROM comments_table 
WHERE comment_id in (
    SELECT MAX(comment_id) 
    FROM comments_table where userId in (2001, 2002, 2010) 
    GROUP BY userId 
) 

上面的查询工作的想法,但时间过长,特别是如果有很多的用户id需要。

我需要一个更快的查询语句来完成同样的事情。

回答

9

使用JOIN,而不是一个子查询:

SELECT 
    b.* 
FROM 
    (
     SELECT userid, MAX(comment_id) AS maxcomment 
     FROM comments_table 
     WHERE userid IN (2001, 2002, 2010) 
     GROUP BY userid 
    ) a 
INNER JOIN 
    comments_table b ON 
     a.userid = b.userid AND 
     a.maxcomment = b.comment_id 

子选择在此查询将只执行一次,而不是一个子查询WHERE IN将在意见表的每一行执行。

+0

将查询时间从1秒减少到0.0026。谢谢 – user1502826

+0

什么我需要添加到上面的查询,如果有另一个表称为user_details作为你我也想提取列u.mainimage和u.fullname可能使用b.user_id = u.user_id – user1502826

+0

什么表将'user_details'连接链接?评论表?用户表? –

0

尝试用

  select comment, comment_id, userId FROM   comments_table WHERE userId in (2001, 2002, 2010) order by comment_id desc limit 1 

试试看这个查询等效与你 随着对userid列的索引,这应该表现得比体面

+0

这只会检索一行:*来自三个用户中的任何一个的最新评论*。 O.P.要求三位用户中的每个***最近发表的评论意见,这意味着您必须针对每位用户发表的评论进行分组最大化。 –

0

更多让我们保持它的简单:

SELECT comment, MAX(comment_id), userId 
FROM comments_table 
WHERE userId IN (2001, 2002, 2010) 
GROUP BY userId; 
+0

该解决方案将根据'userid'拉取最新的'comment_id',但'comment'字段与'comment_id'的对应关系不正确。 –