mysql group_concat 评分切片问题

mysql group_concat question for rating slices

我正在创建一个迷你电子商务应用程序,用户可以在其中对他们购买的商品进行评分。

评分是一个从 1 到 5 的整数(代表星星)。

一个用户只能评价一个项目一次。

我有以下表格:

从那里我想查询 select 所有项目,以及每个项目 我需要知道每个产品有多少个评级值(即有多少个 5 星, 多少个 4 星,...,多少个 1 星)。

到目前为止,我得到了这个(复杂的)查询,它有效:

select i.id,
       i.label,
       t1.rating,
       t1.nb_ratings


from lks_item i


         inner join
     (
         select item_id,
                rating,
                count(*) as nb_ratings
         from lks_user_rates_item h
         group by h.rating, h.item_id
     ) as t1 on i.id = t1.item_id


where i.item_type = '1'
  and i.status = '1'


order by i.id asc, t1.rating asc


这是我得到的摘录:

+--+--------+------+----------+
|id|label   |rating|nb_ratings|
+--+--------+------+----------+
|21|item1   |1     |2         |
|21|item1   |3     |1         |
|21|item1   |4     |1         |
|21|item1   |5     |1         |
|22|item2   |1     |3         |
|22|item2   |2     |4         |
|22|item2   |3     |3         |
|22|item2   |5     |4         |
|23|item3   |1     |2         |
+--+--------+------+----------+

尽管这样可以完成工作,但它 returns 每个评级值一行。 例如,项目 #21 有 4 行(因为它有 4 个不同的评级值), 项目 #22 也有 4 行。

我很好奇有没有办法只 在 mysql GROUP_CONCAT 函数的帮助下,每个项目一行。

换句话说,是否有可能获得更像这样的查询?

+--+--------+-------------------+
|id|label   |nb_ratings         |
+--+--------+-------------------+
|21|item1   |1:2, 3:1, 4:1, 5:1 |
|22|item2   |1:3, 2:4, 3:3, 5:4 |
|23|item3   |1:2                |
+--+--------+-------------------+

在您的查询中,您可以 group by i.id, i.label 并使用 group_concat():

select i.id, i.label,
       group_concat(concat(t.rating, ':', t.nb_ratings) order by t.rating separator ', ') as nb_ratings       
from lks_item i
inner join (
  select item_id,
         rating,
         count(*) as nb_ratings
  from lks_user_rates_item
  group by rating, item_id
) as t on i.id = t.item_id
where i.item_type = '1' and i.status = '1'
group by i.id, i.label
order by i.id