Mysql json数据类型计数和groupby

时间:2016-05-20 13:01:22

标签: mysql json

因此,自从mysql 5.7起,我现在可以使用json数据类型,这在使用angularjs这样的框架时非常好。

现在因为我相当新的(这个数据类型也相当新)我想知道我是否可以对该数据集进行一些简单的操作。

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

name
country
phone_num

我想做的是我希望总结每个国家生活的人数,通常这样的选择会起作用

select country, count(*) as num_residents from mytable

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

任何人都可以帮助我吗?

更新

好的,所以我的表看起来像这样:

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

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

enter image description here

1 个答案:

答案 0 :(得分:4)

首先,您将所有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