【问题标题】:Mysql json datatype count and groupbyMysql json数据类型计数和groupby
【发布时间】:2016-09-17 18:19:27
【问题描述】:

因此,从 mysql 5.7 开始,我现在可以使用 json 数据类型,这在您使用 angularjs 等框架时非常有用。

现在,由于我对此相当陌生(而且这种数据类型也相当新),我想知道我是否可以对该数据集进行一些简单的操作。

例如,我在我的数据库中保存了一个 json,其中每个对象都包含以下字段:

name
country
phone_num

我想做的是总结每个国家有多少人,通常这样的选择会起作用

select country, count(*) as num_residents from mytable

但是我不太确定如何在具有 json 数据类型的表上使用这种选择语句。

谁能帮帮我?

更新

好的,所以我的表格如下所示:

id  int(11) AI PK
date_created    timestamp
data    json
schema_id   int(11)

数据如下:

[{"A": 1, "B": "Debra", "C": "Peters", "D": "dpeters0@accuweather.com", "E": "Female", "F": "Tsagaan-Ovoo"}, {"A": 2, "B": "Marc", "C": "Rasmussen", "D": "Marc@test.dk", "E": "Male", "F": "Copenhagen"}]

我正在尝试以下 sql 语句:

    SELECT
  data,
  JSON_EXTRACT(data, "$.F")        AS country,
  count(JSON_EXTRACT(data, "$.F")) AS num_residents
FROM kpi_data
WHERE schema_id = 39
GROUP BY country, data

但遗憾的是我得到了这个结果:

【问题讨论】:

  • Marc,看看JSON_EXTRACT 函数。你可以做类似select JSON_EXTRACT(doc, "$.country") as country, count(JSON_EXTRACT(doc, "$.country")) as num_residents from mytable
  • @algor ive 更新了我的帖子,你能看看我做错了什么吗?
  • @MarcRasmussen 我可以看到数据实际上是 2 个文档(Debra 和 Marc)的数组,尝试按索引访问值:$[0].F 或 $[1].F(我有没有尝试过这种方法,因为我现在无法访问数据库)

标签: mysql json


【解决方案1】:

首先,您将所有 JSON 存储在一行中,如果您想像这样查询数据,每个居民都应该拥有自己的 JSON 行:

*other_fields*, {"A": 1, "B": "Debra", "C": "Peters", "D": "dpeters0@accuweather.com", "E": "Female", "F": "Tsagaan-Ovoo"}
*other_fields*, {"A": 2, "B": "Marc", "C": "Rasmussen", "D": "Marc@test.dk", "E": "Male", "F": "Copenhagen"}

其次,您不需要计算提取的数据,只需计算提取的每个国家/地区的行数。这样就可以了:

SELECT JSON_EXTRACT(data, "$.F") AS country,
       COUNT(*) AS num_residents

第三,您根本不想GROUP BY data,因为这可能是每个居民唯一的。这将为每一行留下一个组。我想你只是想要:

GROUP BY country

把它们放在一起:

  SELECT JSON_EXTRACT(data, "$.F") AS country,
         COUNT(*) AS num_residents
    FROM kpi_data
   WHERE schema_id = 39
GROUP BY country

为了获得不错的性能,您可以考虑在提取的国家/地区放置二级索引。请参阅DOCS

【讨论】:

  • 是不是因为我的数据被封装在这样的数组中 [{}] 我无法查询它如果是这样我应该如何存储数据?正确存放?
  • 另外你知道我怎么做一个 where 语句吗?
  • 我的建议就在“首先...”之后;将数组中的每个对象存储为单独的行。之后就不需要数组了。
  • 已更新以包含您的 WHERE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2019-01-20
  • 2018-10-09
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多