计数和组连续的Concat和命令

时间:2015-04-18 12:11:04

标签: mysql

我有点麻烦,想要以相当奇怪的方式从db获取内容。说我有下一张桌子

ID  |   Rating
229 |   3
229 |   2
229 |   4
229 |   2
240 |   3
233 |   1
233 |   4
233 |   1
233 |   5
229 |   4
240 |   4

我需要看起来像

229 |   4,3,2   |   2,1,2
240 |   4,3     |   1,1
233 |   5,4,1   |   1,1,2

基本上,我需要第二列作为此ID的desc顺序的所有唯一分数的列表,并且第3列需要以逗号分隔每个这些唯一分数的计数,因此就像上面的示例中一样,对于第一个id,它将是2,1,2因为该ID得分为2,得分为4,得分为3,得分为2,得分为2.这需要与第2栏中的内容顺序相同。我试过了

select object_id, group_concat(concat(rating)) list, group_concat(qty)
from (
select object_id, rating, count(rating) qty
from wp_fb_ratings
group by rating, object_id
order by rating desc
) n
group by object_id

我需要的是什么,除了它完全忽略了顺序并返回

229 |   3,2,4   |   1,2,2
233 |   1,4,5   |   2,1,1
240 |   3,4     |   1,1

这是什么解决方法?或者也许它应该以其他方式完成?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您只需要一个子查询来计算计数,然后再进行最终聚合:

select id, group_concat(score order by score desc) as scores,
       group_concat(cnt order by score desc) as counts
from (select id, score, count(*) as cnt
      from table t
      group by id, score
     ) t
group by id;

对于示例中的表格:

select object_id, group_concat(rating order by rating desc)as ratings,
       group_concat(qty order by rating desc) as qtys
from (select object_id, rating, count(rating) as qty
      from wp_fb_ratings
      group by rating, object_id
     ) t
group by object_id;