Mysql JSON列中的顶级值
我有一个具有以下通用模式的表:Mysql JSON列中的顶级值,mysql,Mysql,我有一个具有以下通用模式的表: 创建表统计信息( 指示符varchar(128)不为空, 数据json不为空 ) 我在该表中插入了一行,该行与以下内容类似: 插入统计(指标、数据)值('actions','{“John”:3,“Jack”:1,“James”:7,“Jess”:3,“Mary”:6,“Nathan”:2}')) 我需要获取这一行的前三个操作计数和相关名称(按值降序排列) 期望结果-请注意,对于此特定值集,最前面的“三个”操作将导致列出四个名称: Name | Actions
创建表统计信息(
指示符varchar(128)不为空,
数据json不为空
)
我在该表中插入了一行,该行与以下内容类似:
插入统计(指标、数据)值('actions','{“John”:3,“Jack”:1,“James”:7,“Jess”:3,“Mary”:6,“Nathan”:2}'))
我需要获取这一行的前三个操作计数和相关名称(按值降序排列)
期望结果-请注意,对于此特定值集,最前面的“三个”操作将导致列出四个名称:
Name | Actions
--------------
James | 7
Mary | 6
Jack | 3
Jess | 3
我需要一个只有MySQL的解决方案,因为实际数据可能包含数十万个值。简短回答:不是这样 MySQL非常擅长比较和排序,但前提是要排序的数据位于自己的列中 鉴于您需要“仅mySQL”解决方案,但没有说明“数据结构”易于更改,我建议将数据拆分为1:n关系中的多个表 因此,我们有一个表,用于标识统计数据,可能如下所示:
create table stats (
statID int(11) AUTO_INCREMENT,
indicator varchar(128) not null,
);
create table actions (
statID int(11),
actions int(11),
name varchar(32)
);
然后,您可以通过指定insert-into-stats值(NULL,'action')
继续创建“数据集”,并记下您获得的自动ID
然后我们有第二张桌子,看起来像这样:
create table stats (
statID int(11) AUTO_INCREMENT,
indicator varchar(128) not null,
);
create table actions (
statID int(11),
actions int(11),
name varchar(32)
);
然后,您将继续使用前面获得的statID为每个用户添加一个数据集,如insert-into-actions-VALUES(statID,7,'Jack')代码>等
填写完表格后,您现在可以执行一个简单的选择名称,从actions ORDER BY actions DESC LIMIT 3中选择actions,以获得前3个名称
或者,您可以完全跳过整个“stats”表(以及相关的statID),只使用“actions”表
然而,所有这些都依赖于一个事实,即所有的“动作”实际上都是相同的格式
另外,请注意,我从头开始编写所有代码,可能语法不正确。通常在原始mySQL查询后面会有一些处理,比如PHP、C或其他。例如,PHP能够将JSON字符串解码为一个对象,然后您可以根据需要对内容进行排序。恐怕我不知道单独使用mysql是如何做到这一点的,因为mysql的值只是一个简单的字符串。或者,您需要修改您的数据库方案,例如:“stats”不是一个数据集中的所有数据,但是有多个数据集,每个用户一个。要添加到上述注释中,在MySQL中可能有编写查询的方法,但是您的用户数据应该在JSON数组中,而不是作为每个用户的单独键值对。您需要按照上面的建议修复数据模型。Json_table()函数可能会有所帮助,因为它可以将Json结构转换为传统的sql表。然而,整个数据结构可以很容易地在传统的关系表中完成,因此查询将变得很简单。