饼图的前 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
我想通过添加另一个名为 "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