Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql JSON列中的顶级值_Mysql - Fatal编程技术网

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表。然而,整个数据结构可以很容易地在传统的关系表中完成,因此查询将变得很简单。