mysql - MYSQL中如何拼接一个组中前N条记录的查询结果

标签 mysql sql ruby-on-rails-3 ruby-on-rails-4

我有以下查询,它按降序顺序按用户 ID 分组的名称计数。到目前为止,我已经达到了,但不能超越。我想连接每个用户前 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():

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;

注意:

  • @rn@grp 的表达式是单个表达式。 MySQL 不保证 SELECT 中表达式的计算顺序,因此单个表达式是安全分配两个变量的唯一方法。
  • 变量已初始化。
  • WHERE 子句是确定“前 2 个”的地方。

关于mysql - MYSQL中如何拼接一个组中前N条记录的查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51405156/

相关文章:

mysql - 根据第三个主表查询2个表

php - 我想从 .txt 和数据库中找到相同的行,然后根据文本文件中的新行更新数据库

sql - ORA-904 在包含嵌套表和其他联接的查询中引用基表时

mysql - 如何根据行在表格中出现的次数来选择行?

ruby-on-rails-3 - Rails Active Admin 资源问题

java - 使用java jdbc从mysql下载blob(音频)。一切顺利,但我无法播放音频

mysql - 如何从mysql中以前的备份中恢复特定表

php - 与之前的 SELECT 语句相比,从 MySQL 数据库中选择剩余的项目

ruby-on-rails - Ruby on Rails Controller 代码,需要重构最佳方式来实现更干燥吗?

ruby-on-rails - 删除文件后没有该文件或目录,ruby on Rails