如何在mysql中concat一个组的前n条记录的查询结果

oknwwptz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(537)

我有下面的查询,它给出按用户id按desc顺序分组的名称计数。我已经达到了目前的程度,但不能超越这一点。我想在每个用户的前2个记录的名称列。
目前的查询是:

  1. SELECT t.*,
  2. IF(@grp = t.user_id, @rowno := @rowno + 1, @rowno := 1) AS rowno,
  3. @grp := t.user_id AS u_id
  4. FROM (SELECT notes.user_id,
  5. t.name name,
  6. Count(t.name) ct
  7. FROM notes
  8. INNER JOIN tags t
  9. ON notes.id = t.note_id
  10. GROUP BY notes.user_id,
  11. t.name
  12. ORDER BY notes.user_id,
  13. Count(t.name) DESC) t;

结果如下:

  1. +---------+------------+----+-------+-----+
  2. | user_id | name | ct | rowno | uid |
  3. +---------+------------+----+-------+-----+
  4. | 282 | realifex | 1 | 1 | 282 |
  5. +---------+------------+----+-------+-----+
  6. | 282 | clear | 1 | 2 | 282 |
  7. +---------+------------+----+-------+-----+
  8. | 282 | thinking | 1 | 3 | 282 |
  9. +---------+------------+----+-------+-----+
  10. | 282 | refreshing | 1 | 4 | 282 |
  11. +---------+------------+----+-------+-----+
  12. | 285 | solid | 2 | 1 | 285 |
  13. +---------+------------+----+-------+-----+
  14. | 285 | clear | 1 | 2 | 285 |
  15. +---------+------------+----+-------+-----+
  16. | 285 | thinking | 1 | 3 | 285 |
  17. +---------+------------+----+-------+-----+
  18. | 287 | holidays | 3 | 1 | 287 |
  19. +---------+------------+----+-------+-----+
  20. | 287 | Larry | 3 | 2 | 287 |
  21. +---------+------------+----+-------+-----+
  22. | 287 | travel | 2 | 3 | 287 |
  23. +---------+------------+----+-------+-----+
  24. | 287 | thinking | 1 | 4 | 287 |
  25. +---------+------------+----+-------+-----+

我尝试将每个用户组的前2个结果合并为一列,如下所示:

  1. +---------+----------------+
  2. | user_id | name |
  3. +---------+----------------+
  4. | 282 | realifex,clear |
  5. +---------+----------------+
  6. | 285 | solid, clear |
  7. +---------+----------------+
  8. | 287 | Larry,travel |
  9. +---------+----------------+
qqrboqgw

qqrboqgw1#

ue公司 group_concat() :

  1. SELECT group_id, group_concat(name order by rn) as names
  2. FROM (SELECT t.*,
  3. (@rn := IF(@grp = t.user_id, @rowno := @rowno + 1,
  4. IF(@grp := t.user_id, 1, 1)
  5. )
  6. ) as rn
  7. FROM (SELECT n.user_id, t.name, n.name, Count(t.name) ct
  8. FROM notes n INNER JOIN
  9. tags t
  10. ON notes.id = t.note_id
  11. GROUP BY n.user_id, t.name
  12. ORDER BY n.user_id, Count(t.name) DESC
  13. ) t CROSS JOIN
  14. (SELECT @rn := 0, @grp := -1) params
  15. ) t
  16. WHERE rn <= 2
  17. GROUP BY user_id;

注:
的表达式 @rn 以及 @grp 是一个表达式。mysql不保证表达式在 SELECT ,因此只有一个表达式才能安全地分配这两个变量。
变量已初始化。
这个 WHERE 子句是确定“前2名”的地方。

展开查看全部

相关问题