Как объединить по JSON значениям ключей - PullRequest
0 голосов
/ 07 января 2020

Существует users таблица

id  name    role  points
1   abc     admin  50
2   xyz     writer  25
3   efg     student  10
4   ghi     x_role   7
5   abc2     admin   23

и еще одна participants таблица

id  participants
1   {"admin":[1], "writer":[2], "student": [], "x_role": []}
2   {"admin":[1,5], "writer":[], "student": [3], "x_role": [4]}

Теперь мне нужно рассчитать оценки каждого участника на основе значений admin + писатель + все роли присутствуют в пользовательской таблице.

Результат должен быть

Participants_id  Score

2                90
1                75

1 Ответ

0 голосов
/ 07 января 2020

Вы можете использовать следующее решение:

-- detailled result
SELECT p.id, GROUP_CONCAT(u.name SEPARATOR ', ') AS participants, SUM(u.points) AS score
FROM participants p INNER JOIN users u ON JSON_CONTAINS(JSON_EXTRACT(participants, CONCAT("$.", u.role)), CAST(u.id AS JSON), '$') = 1
GROUP BY p.id
ORDER BY p.id

-- expected result
SELECT p.id AS Participants_id, SUM(u.points) AS Score
FROM participants p INNER JOIN users u ON JSON_CONTAINS(JSON_EXTRACT(participants, CONCAT("$.", u.role)), CAST(u.id AS JSON), '$') = 1
GROUP BY p.id
ORDER BY p.id

демо на dbfiddle.uk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...