Mysql 如何连接JSON键和值
有一个Mysql 如何连接JSON键和值,mysql,json,join,inner-join,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],
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]}
和另一个参与者
表
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
塞巴斯蒂安,你真的试过这个吗?在任何情况下,这个JSON字符串表示一对多的关系,即使JSON字符串文本也需要保留,它实际上应该在数据库本身中表示。这将是一个缓慢的w-w-w查询…如果有超过5个角色,我不认为这是最佳的solution@SebastianBrosch我已经添加了结果我已经更新了我的问题,我希望你能得到它