У меня проблема с выбором GROUP_CONCAT, который также должен иметь нумерацию строк, аналогичную этому вопросу нумерация GROUP_CONCAT разница в том, что мне нужно группировать по нескольким столбцам.
В качестве примера у меня есть 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), которые не имеют отношения к запросу).
Мне нужно создать выбор, в котором я получаю GROUP_CONCAT, сгруппированные по submission_id
и category_id
.
Строка Concat должна возвращать Reviewer 1: {rating}, Reviewer 2: {rating}, Reviewer 3: {rating} etc.
.
например для submission_id = 1 и category_id = 1 группа concat должна возвращать 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 и сравните строку из двух сгруппированных столбцов (не работает):
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, когда несколько столбцов сгруппированы?
ROW_NUMBER()
. - person Rick James   schedule 17.10.2020