mysql group_concat 评分切片问题
mysql group_concat question for rating slices
我正在创建一个迷你电子商务应用程序,用户可以在其中对他们购买的商品进行评分。
评分是一个从 1 到 5 的整数(代表星星)。
一个用户只能评价一个项目一次。
我有以下表格:
- 用户
- user_rates_item
- 项目
从那里我想查询 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
我正在创建一个迷你电子商务应用程序,用户可以在其中对他们购买的商品进行评分。
评分是一个从 1 到 5 的整数(代表星星)。
一个用户只能评价一个项目一次。
我有以下表格:
- 用户
- user_rates_item
- 项目
从那里我想查询 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