mysql内连接限制结果

时间:2016-01-31 15:51:37

标签: mysql sql

我有两个表格,点和评论(针对位置),评论是通过列spot_id引用点,我想在每个斑点db中选择最后3个评论。

我在这个问题中使用了M Khalid Junaid的代码:mysql select inner join limit

SELECT * FROM (
SELECT c.id, a.author_id, a.author_username, a.comment, a.timestamp,
@r:= CASE WHEN @g = c.id THEN @r +1 ELSE 1 END rownum,
@g:= c.id catgroup
 FROM (SELECT * FROM spots ORDER BY timestamp DESC LIMIT $start_index , $rows_count) as c
 JOIN comments a ON (c.id = a.spot_id)
CROSS JOIN (SELECT @g:=0,@r:=0) t2
ORDER BY c.id , a.timestamp desc
) t
 WHERE rownum <= 3

但问题是,从1开始计算三个统计数据后,它会返回rownum超过3行。

这是rownum&lt; = 3

的结果

enter image description here

正如你所看到的那样,我得到了5个关于现货ID 58而不仅仅是3的评论。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您不应在一个表达式中分配变量,然后在另一个表达式中使用它们。 MySQL不保证select语句中表达式的评估顺序。在您的情况下,这适用于@g

因此,编写查询的正确方法是在单个表达式中执行变量操作:

SELECT *
FROM (SELECT *,
             (@r := IF(@g = c.id, @r + 1,
                       IF(@g := c.id, 1, 1)
                      )
             ) as rownum,
             c.id as catgroup
      FROM category c JOIN
           articles a
           ON c.id = a.category_id CROSS JOIN 
           (SELECT @g := 0, @r := 0) params
      ORDER BY c.id, a.`date` desc
     ) t
WHERE rownum <= 5;

当然,如果你只想要三个结果,那么改变&#34; 5&#34;到&#34; 3&#34;。