饼图的前 X 名用户,在 X 分组到其他后剩余

Top X users for piechart, remaining after X grouped into other

我想通过添加另一个名为 "other" 的部分来修改我用于获取饼图数据的前 5 个用户的查询,其余用户被分组到该部分中。

例如,我有 10 个用户,我想抓取前 5 个评论者,其余 5 个在一个名为 "other" 或类似名称的总计结果下。

示例代码:

SELECT user_id, count(user_id) as cnt
from users
GROUP BY user_id
ORDER BY cnt desc 
LIMIT 5

会抢到前 5 名,我不知道要将剩余用户的总数加到第 6 个结果中,这是他们所有 post 的总和。 (即,如果最后 5 个用户 post 15 篇文章,则第 6 行的 cnt 将为 15)。

您必须像之前那样进行分组,然后在外部查询中添加一个行计数器,但让行计数器在高于某个级别(在您的情况下为 5)时始终具有相同的值。然后在最外层的查询中,您按此行计数器分组。

SELECT user_id, SUM(cnt) AS cnt FROM (
    SELECT cnt, @rowcnt := @rowcnt + 1,
    IF(@rowcnt <= 5, user_id, 'other') AS user_id
    FROM (
        SELECT user_id, count(user_id) as cnt
        from users
        GROUP BY user_id
    ) sq
    , (SELECT @rowcnt := 0) var_init_subquery_alias
    ORDER BY cnt DESC
) ssq
LEFT JOIN comments c ON ssq.user_id = c.user_id
GROUP BY user_id

使用 LEFT JOIN,因为不会有 user_id "other".

的评论
SELECT user_id, SUM(counter) FROM 
(SELECT @rownum := @rownum + 1 AS rank, 
CASE WHEN @rownum <= 5 THEN user_id ELSE 'Other' END AS user_id,
count(user_id) as counter
FROM users, (SELECT @rownum := 0) r GROUP BY user_id) hellTemp
GROUP BY user_id

SAMPLE FIDDLE