如何在MYSQL中解析一组前N条记录的查询结果

如何在MYSQL中解析一组前N条记录的查询结果,mysql,sql,ruby-on-rails-3,ruby-on-rails-4,Mysql,Sql,Ruby On Rails 3,Ruby On Rails 4,我有下面的查询,它给出了按用户id按desc顺序分组的名称计数。到目前为止,我已经做到了,但不能超过这一步。我想在每个用户的前2个记录的名称列中添加一个 目前的查询是: SELECT t.*, IF(@grp = t.user_id, @rowno := @rowno + 1, @rowno := 1) AS rowno, @grp := t.user_id AS u_id FROM (SELECT notes.user_id,

我有下面的查询,它给出了按用户id按desc顺序分组的名称计数。到目前为止,我已经做到了,但不能超过这一步。我想在每个用户的前2个记录的名称列中添加一个

目前的查询是:

SELECT t.*, 
       IF(@grp = t.user_id, @rowno := @rowno + 1, @rowno := 1) AS rowno, 
       @grp := t.user_id AS u_id 
FROM   (SELECT notes.user_id, 
               t.name        name, 
               Count(t.name) ct 
        FROM   notes 
               INNER JOIN tags t 
                       ON notes.id = t.note_id 
        GROUP  BY notes.user_id, 
                  t.name 
        ORDER  BY notes.user_id, 
                  Count(t.name) DESC) t; 
它给出了以下结果:

+---------+------------+----+-------+-----+
| user_id | name       | ct | rowno | uid |
+---------+------------+----+-------+-----+
| 282     | realifex   | 1  | 1     | 282 |
+---------+------------+----+-------+-----+
| 282     | clear      | 1  | 2     | 282 |
+---------+------------+----+-------+-----+
| 282     | thinking   | 1  | 3     | 282 |
+---------+------------+----+-------+-----+
| 282     | refreshing | 1  | 4     | 282 |
+---------+------------+----+-------+-----+
| 285     | solid      | 2  | 1     | 285 |
+---------+------------+----+-------+-----+
| 285     | clear      | 1  | 2     | 285 |
+---------+------------+----+-------+-----+
| 285     | thinking   | 1  | 3     | 285 |
+---------+------------+----+-------+-----+
| 287     | holidays   | 3  | 1     | 287 |
+---------+------------+----+-------+-----+
| 287     | Larry      | 3  | 2     | 287 |
+---------+------------+----+-------+-----+
| 287     | travel     | 2  | 3     | 287 |
+---------+------------+----+-------+-----+
| 287     | thinking   | 1  | 4     | 287 |
+---------+------------+----+-------+-----+
我试图将每个用户组的前2个结果合并到一列中,如下所示:

+---------+----------------+
| user_id | name           |
+---------+----------------+
| 282     | realifex,clear |
+---------+----------------+
| 285     | solid,   clear |
+---------+----------------+
| 287     | Larry,travel   |
+---------+----------------+
Ue group_concat:

注:

@rn和@grp的表达式是单个表达式。MySQL不保证SELECT中表达式的求值顺序,因此单个表达式是安全分配这两个变量的唯一方法。 变量已初始化。 WHERE子句是确定前2名的地方。
嘿@Gordon谢谢你的回答,但我面临语法问题。试图解决它,但没有运气。面临以下错误。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near的正确语法IF@grp:=t.user_id,1,1'在第行4@Prem . . . 在前一行中有一个关于if的额外参数。非常感谢您的努力和帮助,但我对查询进行了一些调整,使其运行并且正在运行,但结果不一样。查询结果没有连接,每个组只有一个名称,而不是前两个结果282 | realifex | | 285 | solid | | 287 | Larry |谢谢@Gordon我能够理解整个查询并得到结果。再次感谢你。
SELECT group_id, group_concat(name order by rn) as names
FROM (SELECT t.*, 
             (@rn := IF(@grp = t.user_id, @rowno := @rowno + 1, 
                        IF(@grp := t.user_id, 1, 1)
                       )
             )  as rn
      FROM (SELECT n.user_id, t.name, n.name,  Count(t.name) ct 
            FROM notes n INNER JOIN
                 tags t 
                 ON notes.id = t.note_id 
            GROUP BY n.user_id,  t.name 
            ORDER BY n.user_id, Count(t.name) DESC
           ) t CROSS JOIN
           (SELECT @rn := 0, @grp := -1) params
     ) t
WHERE rn <= 2
GROUP BY user_id;