【问题标题】:Concat of count and group concat and order by计数和组的连接 concat 和 order by
【发布时间】:2015-04-18 12:11:04
【问题描述】:

我在想以一种相当奇怪的方式从 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

基本上,我需要第 2 列按 desc 顺序列出此 id 的所有唯一分数,第 3 列需要用逗号分隔每个这些唯一分数的计数,所以就像上面的示例一样,对于第一个 id,它将为 2,1,2,因为该 id 获得了 2 个评分为 4、1 个评分为 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

我需要什么,除了它完全忽略 order by 并返回

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

对此有什么解决方法?或者也许应该以其他方式完成?

【问题讨论】:

  • 只是好奇,你为什么需要这样?
  • 如果只运行内部选择,那么它是有序的吗?

标签: mysql


【解决方案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;

【讨论】:

  • 是的,这就是我所需要的。
  • 说,能不能加个default之类的?这些评级可以从 1 到 5,例如对于 id 229,第 3 列将返回 0、2、1、2、0(因为没有 5 和 1 评级)。这样,第二列就不需要了。
  • @Flyer 。 . .我建议您将其作为另一个问题提出。
猜你喜欢
  • 2013-11-19
  • 2011-06-28
  • 1970-01-01
  • 2014-03-17
  • 2013-04-13
  • 2021-12-28
  • 1970-01-01
  • 2013-04-13
  • 2012-03-10
相关资源
最近更新 更多