mysql - 如何加入 JSON 键值

标签 mysql json join inner-join

有一个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

和另一个参与者

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

现在我必须根据用户表中存在的管理员+作者+所有角色的值来计算每个参与者的分数。

结果应该是

Participants_id  Score

2                90
1                75

最佳答案

您可以使用以下解决方案:

-- 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

demo on dbfiddle.uk

关于mysql - 如何加入 JSON 键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59633694/

相关文章:

java - 在字符串中查找数字字符串并计数

php - MySQL 和用户身份验证 - 内部查询与查询后的有力证据?

mysql - 将MySQL数据导入Excel 365

java - 将字符串转换为 JSONArray(不是来自 gson 的 JsonArray)

json - 用flutter处理json中的空值

join - 参加弹性搜寻

python - 使用 Scapy 解析 MySQL header

angularjs - 读取名称中带有冒号的 JSON 对象键

Android SQLite 3,JOINS 还是多个查询?

mysql - 简化MYSQL查询