GROUP_CONCAT 多列分组依据编号
GROUP_CONCAT numbering with multiple columns group by
我有一个 GROUP_CONCAT select 的问题,它也应该包含类似于这个问题的行编号
区别在于我必须按多列分组。
例如,我有 2 个表 review
和 review_detail
。
架构(MySQL v5.5)
create table review (
`id` int(11) NOT NULL AUTO_INCREMENT,
`submission_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
create table review_detail (
`id` int(11) NOT NULL AUTO_INCREMENT,
`review_id` int(11),
`category_id` int(11),
`rating` varchar(100),
PRIMARY KEY (`id`)
);
insert into review (`id`, `submission_id`) values (1, 1), (2, 1), (3, 2), (4, 3), (5,1), (6,3), (7,2), (8,3);
insert into review_detail (`review_id`, `category_id`, `rating`)
values
(1, 1, ' submission 1.1 cat 1'), (1, 2, ' submission 1.1 cat 2'),
(2, 1, ' submission 1.2 cat 1'), (2, 2, ' submission 1.2 cat 2'),
(3, 1, ' submission 2.1 cat 1'), (3, 2, ' submission 2.1 cat 2'),
(4, 1, ' submission 3.1 cat 1'), (4, 2, ' submission 3.1 cat 1'),
(5, 1, ' submission 1.3 cat 1'), (5, 2, ' submission 1.3 cat 2'),
(6, 1, ' submission 3.2 cat 1'), (6, 2, ' submission 3.2 cat 2'),
(7, 1, ' submission 2.2 cat 1'), (7, 2, ' submission 2.2 cat 2'),
(8, 1, ' submission 3.3 cat 1'), (6, 2, ' submission 3.3 cat 2')
;
查询#1
SELECT * FROM review;
| id | submission_id |
| --- | ------------- |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 1 |
| 6 | 3 |
| 7 | 2 |
| 8 | 3 |
查询 #2
SELECT * FROM review_detail;
| id | review_id | category_id | rating |
| --- | --------- | ----------- | --------------------- |
| 1 | 1 | 1 | submission 1.1 cat 1 |
| 2 | 1 | 2 | submission 1.1 cat 2 |
| 3 | 2 | 1 | submission 1.2 cat 1 |
| 4 | 2 | 2 | submission 1.2 cat 2 |
| 5 | 3 | 1 | submission 2.1 cat 1 |
| 6 | 3 | 2 | submission 2.1 cat 2 |
| 7 | 4 | 1 | submission 3.1 cat 1 |
| 8 | 4 | 2 | submission 3.1 cat 1 |
| 9 | 5 | 1 | submission 1.3 cat 1 |
| 10 | 5 | 2 | submission 1.3 cat 2 |
| 11 | 6 | 1 | submission 3.2 cat 1 |
| 12 | 6 | 2 | submission 3.2 cat 2 |
| 13 | 7 | 1 | submission 2.2 cat 1 |
| 14 | 7 | 2 | submission 2.2 cat 2 |
| 15 | 8 | 1 | submission 3.3 cat 1 |
| 16 | 6 | 2 | submission 3.3 cat 2 |
提交的每个评论(外键 = submission_id
)都有多个 review_detail 条目 category_id
(在我的示例中只有 2 个类别 (1,2) 不相关用于查询)。
我必须创建一个 select,其中我得到按 submission_id
和 category_id
.
分组的 GROUP_CONCAT
Concat 字符串应该return
Reviewer 1: {rating}, Reviewer 2: {rating}, Reviewer 3: {rating} etc.
.
例如对于 submission_id = 1 和 category_id = 1,组连接应该 return
Reviewer 1: submission 1.1 cat 1, Reviewer 2: submission 1.2 cat 1, Reviewer 3: submission 1.3 cat 1
.
但是我无法在组 concat 中正确编号。
到目前为止,我已经进行了多次测试。
只有一个列计数器的组 (有效):
https://www.db-fiddle.com/f/6hA4Vft1mQGdw2Pew2An2T/3
Reviewer 1: submission 1.1 cat 1 of review 1 / Reviewer 2: submission 3.3 cat 1 of review 8 / Reviewer 3: submission 2.2 cat 1 of review 7 / Reviewer 4: submission 3.2 cat 1 of review 6 / ... etc.
SELECT
--review.submission_id,
review_detail.category_id,
@i,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
@i := @i + 1,
': ',
rating,
' of review ', review_id
)
SEPARATOR ' / '
) concatText,
@i := 0
FROM
review_detail
LEFT JOIN review ON review.id = review_detail.review_id,
(
SELECT
@i := 0
) init
GROUP BY
review_detail.category_id
ORDER BY
review_detail.category_id ASC
;
使用 if 进行测试并与 2 个分组列的字符串进行比较 (不起作用):
https://www.db-fiddle.com/f/3woAVSw5hrav15jAmuWVdT/3
Reviewer 1: submission 1.1 cat 1 of review 1 / Reviewer 1: submission 1.2 cat 1 of review 2 / Reviewer 1: submission 1.3 cat 1 of review 5
SELECT
submission_id,
category_id,
@i,
@grp,
CONCAT_WS("-", submission_id, category_id) AS catgroup,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
@i := IF(
@grp = CONCAT_WS("-", submission_id, category_id),
@i + 1,
IF(
@grp := CONCAT_WS("-", submission_id, category_id),
1,
1
)
),
': ',
rating,
' of review ', review_id
)
ORDER BY review_id, submission_id, category_id
SEPARATOR ' / '
) concatText
FROM
review_detail
LEFT JOIN review ON review.id = review_detail.review_id,
(
SELECT
@i := 0,
@grp := ''
) init
GROUP BY
review.submission_id,
review_detail.category_id
那么有谁知道在多个列分组时正确获取 GROUP_CONCAT 调用中的编号的方法吗?
您应该避免在生产代码中使用 user-defined 变量。
在 manual for MySQL 5.6 中说:
As a general rule, other than in SET statements, you should never
assign a value to a user variable and read the value within the same
statement.
甚至在 documentation for 8.0 中也指出:
The order of evaluation for expressions involving user variables is
undefined. For example, there is no guarantee that SELECT @a, @a:=@a+1
evaluates @a
first and then performs the assignment.
在未来的版本中,这可能不再完全有效:
Previous releases of MySQL made it possible to assign a value to a
user variable in statements other than SET. This functionality is
supported in MySQL 8.0 for backward compatibility but is subject to
removal in a future release of MySQL.
所以这是一个没有 user-defined 变量的解决方案:
SELECT
r.submission_id,
rd.category_id,
GROUP_CONCAT(CONCAT('Reviewer ', (SELECT COUNT(*) + 1
FROM review
JOIN review_detail ON review.id = review_detail.review_id
WHERE r.submission_id = review.submission_id
AND review_detail.category_id = rd.category_id
AND review_detail.id < rd.id
), ': ', rating, ' of review ', review_id) ORDER BY rating SEPARATOR ' / ') AS shorter_column_name
FROM
review r
JOIN review_detail rd ON rd.review_id = r.id
GROUP BY r.submission_id, rd.category_id;
哪个returns
+---------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| submission_id | category_id | shorter_column_name |
+---------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | 1 | Reviewer 1: submission 1.1 cat 1 of review 1 / Reviewer 2: submission 1.2 cat 1 of review 2 / Reviewer 3: submission 1.3 cat 1 of review 5 |
| 1 | 2 | Reviewer 1: submission 1.1 cat 2 of review 1 / Reviewer 2: submission 1.2 cat 2 of review 2 / Reviewer 3: submission 1.3 cat 2 of review 5 |
| 2 | 1 | Reviewer 1: submission 2.1 cat 1 of review 3 / Reviewer 2: submission 2.2 cat 1 of review 7 |
| 2 | 2 | Reviewer 1: submission 2.1 cat 2 of review 3 / Reviewer 2: submission 2.2 cat 2 of review 7 |
| 3 | 1 | Reviewer 1: submission 3.1 cat 1 of review 4 / Reviewer 2: submission 3.2 cat 1 of review 6 / Reviewer 3: submission 3.3 cat 1 of review 8 |
| 3 | 2 | Reviewer 1: submission 3.1 cat 1 of review 4 / Reviewer 2: submission 3.2 cat 2 of review 6 / Reviewer 3: submission 3.3 cat 2 of review 6 |
+---------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
修复您的查询。
基本问题是表本质上是未排序的,这就是为什么 MySQL 优化器删除了 ORDER BY
.
在MySQL中是否足以将所有表放在FROM
子句中并使用顺序进行子查询,mysql将保留它。
在 Mariadb 中,这还不够您还添加了一个 LIMIT 18446744073709551615
以便优化器将保留它
架构(MySQL v5.5)
查询#1
SELECT
submission_id,
category_id,
@i,
@grp,
CONCAT_WS("-", submission_id, category_id) AS catgroup,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
@i := IF(
@grp = CONCAT_WS("-", submission_id, category_id),
@i := @i + 1,
IF(
@grp := CONCAT_WS("-", submission_id, category_id),
1,
1
)
),
': ',
rating,
' of review ', review_id
)
ORDER BY review_id, submission_id, category_id
SEPARATOR ' / '
) concatText
FROM
(SELECT review_id, submission_id, category_id,`rating` FROM review_detail
LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY review_id, submission_id, category_id ) t1,
(
SELECT
@i := 0,
@grp := ''
) init
GROUP BY
submission_id,
category_id;
结果
| submission_id | category_id | @i | @grp | catgroup | concatText |
| ------------- | ----------- | --- | ---- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | 1 | 0 | | 1-1 | Reviewer 3: submission 1.1 cat 1 of review 1 / Reviewer 2: submission 1.2 cat 1 of review 2 / Reviewer 1: submission 1.3 cat 1 of review 5 |
| 1 | 2 | 3 | 1-1 | 1-2 | Reviewer 3: submission 1.1 cat 2 of review 1 / Reviewer 2: submission 1.2 cat 2 of review 2 / Reviewer 1: submission 1.3 cat 2 of review 5 |
| 2 | 1 | 3 | 1-2 | 2-1 | Reviewer 1: submission 2.1 cat 1 of review 3 / Reviewer 2: submission 2.2 cat 1 of review 7 |
| 2 | 2 | 2 | 2-1 | 2-2 | Reviewer 2: submission 2.1 cat 2 of review 3 / Reviewer 1: submission 2.2 cat 2 of review 7 |
| 3 | 1 | 2 | 2-2 | 3-1 | Reviewer 2: submission 3.1 cat 1 of review 4 / Reviewer 1: submission 3.2 cat 1 of review 6 / Reviewer 3: submission 3.3 cat 1 of review 8 |
| 3 | 2 | 3 | 3-1 | 3-2 | Reviewer 3: submission 3.1 cat 1 of review 4 / Reviewer 2: submission 3.3 cat 2 of review 6 / Reviewer 1: submission 3.2 cat 2 of review 6 |
您需要使用 tow-step 子查询按审稿人编号排序。
SET @i := 0;
SET @grp := '';
SELECT
submission_id,
category_id,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
i,
': ',
rating,
' of review ', review_id
)
ORDER BY i
SEPARATOR ' / '
) concatText
FROM
-- second, add numbering
(
SELECT *,
@i := IF(
@grp = @grp := CONCAT_WS('-',submission_id,category_id),
@i + 1, 1) i
FROM
-- first, sort for numbering
(
SELECT
review_id,
submission_id,
category_id,
rating
FROM review_detail LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY
submission_id,
category_id,
review_id
) t1
) t2
GROUP BY
submission_id,
category_id
;
为了完整起见,我还添加了如何在 Mysql 8.0
中完成的解决方案
它适用于 COUNT(*)
with base as (
SELECT
review_id,
submission_id,
category_id,
rating,
count(*) over (partition by submission_id,category_id order by review_id) num
FROM review_detail LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY
submission_id,
category_id,
review_id
)
select
submission_id,
category_id,
group_concat(concat('Reviewer', num, ': ', rating, ' of review ', review_id ) separator ', ') concattext
from base
group by
submission_id,
category_id
;
或ROW_NUMBER()
with base as (
SELECT
review_id,
submission_id,
category_id,
rating,
ROW_NUMBER() over (partition by submission_id,category_id order by review_id) num
FROM review_detail
LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY
submission_id,
category_id,
review_id
)
SELECT
submission_id,
category_id,
group_concat(concat('Reviewer', num, ': ', rating, ' of review ', review_id ) separator ', ') concattext
from base
group by
submission_id,
category_id
;
我有一个 GROUP_CONCAT select 的问题,它也应该包含类似于这个问题的行编号
例如,我有 2 个表 review
和 review_detail
。
架构(MySQL v5.5)
create table review (
`id` int(11) NOT NULL AUTO_INCREMENT,
`submission_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
create table review_detail (
`id` int(11) NOT NULL AUTO_INCREMENT,
`review_id` int(11),
`category_id` int(11),
`rating` varchar(100),
PRIMARY KEY (`id`)
);
insert into review (`id`, `submission_id`) values (1, 1), (2, 1), (3, 2), (4, 3), (5,1), (6,3), (7,2), (8,3);
insert into review_detail (`review_id`, `category_id`, `rating`)
values
(1, 1, ' submission 1.1 cat 1'), (1, 2, ' submission 1.1 cat 2'),
(2, 1, ' submission 1.2 cat 1'), (2, 2, ' submission 1.2 cat 2'),
(3, 1, ' submission 2.1 cat 1'), (3, 2, ' submission 2.1 cat 2'),
(4, 1, ' submission 3.1 cat 1'), (4, 2, ' submission 3.1 cat 1'),
(5, 1, ' submission 1.3 cat 1'), (5, 2, ' submission 1.3 cat 2'),
(6, 1, ' submission 3.2 cat 1'), (6, 2, ' submission 3.2 cat 2'),
(7, 1, ' submission 2.2 cat 1'), (7, 2, ' submission 2.2 cat 2'),
(8, 1, ' submission 3.3 cat 1'), (6, 2, ' submission 3.3 cat 2')
;
查询#1
SELECT * FROM review;
| id | submission_id |
| --- | ------------- |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 1 |
| 6 | 3 |
| 7 | 2 |
| 8 | 3 |
查询 #2
SELECT * FROM review_detail;
| id | review_id | category_id | rating |
| --- | --------- | ----------- | --------------------- |
| 1 | 1 | 1 | submission 1.1 cat 1 |
| 2 | 1 | 2 | submission 1.1 cat 2 |
| 3 | 2 | 1 | submission 1.2 cat 1 |
| 4 | 2 | 2 | submission 1.2 cat 2 |
| 5 | 3 | 1 | submission 2.1 cat 1 |
| 6 | 3 | 2 | submission 2.1 cat 2 |
| 7 | 4 | 1 | submission 3.1 cat 1 |
| 8 | 4 | 2 | submission 3.1 cat 1 |
| 9 | 5 | 1 | submission 1.3 cat 1 |
| 10 | 5 | 2 | submission 1.3 cat 2 |
| 11 | 6 | 1 | submission 3.2 cat 1 |
| 12 | 6 | 2 | submission 3.2 cat 2 |
| 13 | 7 | 1 | submission 2.2 cat 1 |
| 14 | 7 | 2 | submission 2.2 cat 2 |
| 15 | 8 | 1 | submission 3.3 cat 1 |
| 16 | 6 | 2 | submission 3.3 cat 2 |
提交的每个评论(外键 = submission_id
)都有多个 review_detail 条目 category_id
(在我的示例中只有 2 个类别 (1,2) 不相关用于查询)。
我必须创建一个 select,其中我得到按 submission_id
和 category_id
.
Concat 字符串应该return
Reviewer 1: {rating}, Reviewer 2: {rating}, Reviewer 3: {rating} etc.
.
例如对于 submission_id = 1 和 category_id = 1,组连接应该 return
Reviewer 1: submission 1.1 cat 1, Reviewer 2: submission 1.2 cat 1, Reviewer 3: submission 1.3 cat 1
.
但是我无法在组 concat 中正确编号。
到目前为止,我已经进行了多次测试。
只有一个列计数器的组 (有效):
https://www.db-fiddle.com/f/6hA4Vft1mQGdw2Pew2An2T/3
Reviewer 1: submission 1.1 cat 1 of review 1 / Reviewer 2: submission 3.3 cat 1 of review 8 / Reviewer 3: submission 2.2 cat 1 of review 7 / Reviewer 4: submission 3.2 cat 1 of review 6 / ... etc.
SELECT
--review.submission_id,
review_detail.category_id,
@i,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
@i := @i + 1,
': ',
rating,
' of review ', review_id
)
SEPARATOR ' / '
) concatText,
@i := 0
FROM
review_detail
LEFT JOIN review ON review.id = review_detail.review_id,
(
SELECT
@i := 0
) init
GROUP BY
review_detail.category_id
ORDER BY
review_detail.category_id ASC
;
使用 if 进行测试并与 2 个分组列的字符串进行比较 (不起作用):
https://www.db-fiddle.com/f/3woAVSw5hrav15jAmuWVdT/3
Reviewer 1: submission 1.1 cat 1 of review 1 / Reviewer 1: submission 1.2 cat 1 of review 2 / Reviewer 1: submission 1.3 cat 1 of review 5
SELECT
submission_id,
category_id,
@i,
@grp,
CONCAT_WS("-", submission_id, category_id) AS catgroup,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
@i := IF(
@grp = CONCAT_WS("-", submission_id, category_id),
@i + 1,
IF(
@grp := CONCAT_WS("-", submission_id, category_id),
1,
1
)
),
': ',
rating,
' of review ', review_id
)
ORDER BY review_id, submission_id, category_id
SEPARATOR ' / '
) concatText
FROM
review_detail
LEFT JOIN review ON review.id = review_detail.review_id,
(
SELECT
@i := 0,
@grp := ''
) init
GROUP BY
review.submission_id,
review_detail.category_id
那么有谁知道在多个列分组时正确获取 GROUP_CONCAT 调用中的编号的方法吗?
您应该避免在生产代码中使用 user-defined 变量。
在 manual for MySQL 5.6 中说:
As a general rule, other than in SET statements, you should never assign a value to a user variable and read the value within the same statement.
甚至在 documentation for 8.0 中也指出:
The order of evaluation for expressions involving user variables is undefined. For example, there is no guarantee that
SELECT @a, @a:=@a+1
evaluates@a
first and then performs the assignment.
在未来的版本中,这可能不再完全有效:
Previous releases of MySQL made it possible to assign a value to a user variable in statements other than SET. This functionality is supported in MySQL 8.0 for backward compatibility but is subject to removal in a future release of MySQL.
所以这是一个没有 user-defined 变量的解决方案:
SELECT
r.submission_id,
rd.category_id,
GROUP_CONCAT(CONCAT('Reviewer ', (SELECT COUNT(*) + 1
FROM review
JOIN review_detail ON review.id = review_detail.review_id
WHERE r.submission_id = review.submission_id
AND review_detail.category_id = rd.category_id
AND review_detail.id < rd.id
), ': ', rating, ' of review ', review_id) ORDER BY rating SEPARATOR ' / ') AS shorter_column_name
FROM
review r
JOIN review_detail rd ON rd.review_id = r.id
GROUP BY r.submission_id, rd.category_id;
哪个returns
+---------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| submission_id | category_id | shorter_column_name |
+---------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | 1 | Reviewer 1: submission 1.1 cat 1 of review 1 / Reviewer 2: submission 1.2 cat 1 of review 2 / Reviewer 3: submission 1.3 cat 1 of review 5 |
| 1 | 2 | Reviewer 1: submission 1.1 cat 2 of review 1 / Reviewer 2: submission 1.2 cat 2 of review 2 / Reviewer 3: submission 1.3 cat 2 of review 5 |
| 2 | 1 | Reviewer 1: submission 2.1 cat 1 of review 3 / Reviewer 2: submission 2.2 cat 1 of review 7 |
| 2 | 2 | Reviewer 1: submission 2.1 cat 2 of review 3 / Reviewer 2: submission 2.2 cat 2 of review 7 |
| 3 | 1 | Reviewer 1: submission 3.1 cat 1 of review 4 / Reviewer 2: submission 3.2 cat 1 of review 6 / Reviewer 3: submission 3.3 cat 1 of review 8 |
| 3 | 2 | Reviewer 1: submission 3.1 cat 1 of review 4 / Reviewer 2: submission 3.2 cat 2 of review 6 / Reviewer 3: submission 3.3 cat 2 of review 6 |
+---------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
修复您的查询。
基本问题是表本质上是未排序的,这就是为什么 MySQL 优化器删除了 ORDER BY
.
在MySQL中是否足以将所有表放在FROM
子句中并使用顺序进行子查询,mysql将保留它。
在 Mariadb 中,这还不够您还添加了一个 LIMIT 18446744073709551615
以便优化器将保留它
架构(MySQL v5.5)
查询#1
SELECT
submission_id,
category_id,
@i,
@grp,
CONCAT_WS("-", submission_id, category_id) AS catgroup,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
@i := IF(
@grp = CONCAT_WS("-", submission_id, category_id),
@i := @i + 1,
IF(
@grp := CONCAT_WS("-", submission_id, category_id),
1,
1
)
),
': ',
rating,
' of review ', review_id
)
ORDER BY review_id, submission_id, category_id
SEPARATOR ' / '
) concatText
FROM
(SELECT review_id, submission_id, category_id,`rating` FROM review_detail
LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY review_id, submission_id, category_id ) t1,
(
SELECT
@i := 0,
@grp := ''
) init
GROUP BY
submission_id,
category_id;
结果
| submission_id | category_id | @i | @grp | catgroup | concatText |
| ------------- | ----------- | --- | ---- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | 1 | 0 | | 1-1 | Reviewer 3: submission 1.1 cat 1 of review 1 / Reviewer 2: submission 1.2 cat 1 of review 2 / Reviewer 1: submission 1.3 cat 1 of review 5 |
| 1 | 2 | 3 | 1-1 | 1-2 | Reviewer 3: submission 1.1 cat 2 of review 1 / Reviewer 2: submission 1.2 cat 2 of review 2 / Reviewer 1: submission 1.3 cat 2 of review 5 |
| 2 | 1 | 3 | 1-2 | 2-1 | Reviewer 1: submission 2.1 cat 1 of review 3 / Reviewer 2: submission 2.2 cat 1 of review 7 |
| 2 | 2 | 2 | 2-1 | 2-2 | Reviewer 2: submission 2.1 cat 2 of review 3 / Reviewer 1: submission 2.2 cat 2 of review 7 |
| 3 | 1 | 2 | 2-2 | 3-1 | Reviewer 2: submission 3.1 cat 1 of review 4 / Reviewer 1: submission 3.2 cat 1 of review 6 / Reviewer 3: submission 3.3 cat 1 of review 8 |
| 3 | 2 | 3 | 3-1 | 3-2 | Reviewer 3: submission 3.1 cat 1 of review 4 / Reviewer 2: submission 3.3 cat 2 of review 6 / Reviewer 1: submission 3.2 cat 2 of review 6 |
您需要使用 tow-step 子查询按审稿人编号排序。
SET @i := 0;
SET @grp := '';
SELECT
submission_id,
category_id,
GROUP_CONCAT(
CONCAT(
'Reviewer ',
i,
': ',
rating,
' of review ', review_id
)
ORDER BY i
SEPARATOR ' / '
) concatText
FROM
-- second, add numbering
(
SELECT *,
@i := IF(
@grp = @grp := CONCAT_WS('-',submission_id,category_id),
@i + 1, 1) i
FROM
-- first, sort for numbering
(
SELECT
review_id,
submission_id,
category_id,
rating
FROM review_detail LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY
submission_id,
category_id,
review_id
) t1
) t2
GROUP BY
submission_id,
category_id
;
为了完整起见,我还添加了如何在 Mysql 8.0
中完成的解决方案它适用于 COUNT(*)
with base as (
SELECT
review_id,
submission_id,
category_id,
rating,
count(*) over (partition by submission_id,category_id order by review_id) num
FROM review_detail LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY
submission_id,
category_id,
review_id
)
select
submission_id,
category_id,
group_concat(concat('Reviewer', num, ': ', rating, ' of review ', review_id ) separator ', ') concattext
from base
group by
submission_id,
category_id
;
或ROW_NUMBER()
with base as (
SELECT
review_id,
submission_id,
category_id,
rating,
ROW_NUMBER() over (partition by submission_id,category_id order by review_id) num
FROM review_detail
LEFT JOIN review ON review.id = review_detail.review_id
ORDER BY
submission_id,
category_id,
review_id
)
SELECT
submission_id,
category_id,
group_concat(concat('Reviewer', num, ': ', rating, ' of review ', review_id ) separator ', ') concattext
from base
group by
submission_id,
category_id
;