我在mysql数据库中有两个表,如下所示:character_classes
表:
+--------+----------+
| id | name |
+--------+----------+
| CLA001 | assassin |
| CLA002 | knight |
| CLA003 | vanguard |
+--------+----------+
player_inventories
表:
+--------------+----------------------+
| player_id | character_class |
+--------------+----------------------+
| UID000000001 | ["CLA001"] |
| UID000000002 | ["CLA001", "CLA002"] |
| UID000000003 | ["CLA001", "CLA002", "CLA003"] |
+--------------+----------------------+
我正在尝试将player_inventories
tbl连接到``character_classes to get
character_classes 's names from
character_classes`表:
SELECT player_id, (SELECT CONCAT_WS(
', ',
(select name from character_classes where id = JSON_EXTRACT( character_class, '$[0]') ),
(select name from character_classes where id = JSON_EXTRACT( character_class, '$[1]') ),
(select name from character_classes where id = JSON_EXTRACT( character_class, '$[2]') )
) ) as character_class_name
from player_inventories;
但问题是player_inventories
tbl的character_class
字段中的json项的数量是不同的,它可以是1,2或3甚至更多,所以我需要硬编码索引,即$[0
],$[1]
和$[2]
以获得相应的名称。
有没有什么方法可以改进这个查询,使我可以在不对索引进行硬编码的情况下快速获得所有字符类的名称?
3条答案
按热度按时间zhte4eai1#
不要将类数据存储为JSON。创建一个多对多的表,将玩家IDMap到类ID,然后您可以在查询中使用JOIN来检索所有类名,但必须使用数组索引。
这也使得在类上查询更加容易。查找表中的所有向导比搜索JSON数组要容易得多。
例如:
查询#1
| 姓名|类|
| - -----|- -----|
| 爱丽丝|精灵、地精、巫师|
| 鲍勃|长老,地精|
View on DB Fiddle
ru9i0ody2#
另一种方法是不对索引进行硬编码,您可以使用JSON_CONTAINS函数和一个子查询来匹配character_classes表,从而从player_inventory表中提取所有角色类名。然后应使用GROUP_CONCAT将这些名称合并为一列。使用GROUP BY按player_id对结果进行分组。
sigwle7e3#
考虑@Tangential的答案,如果不能改变表结构,请尝试以下解决方案:
首先使用
JSON_TABLE
将JSON数组转换为行,然后使用GROUP BY
和聚合函数GROUP_CONCAT
获得预期的输出:Demo here