MySQL JSON 数据类型 count 和 groupby

问题描述 投票:0回答:1

从 MySQL 5.7 开始,我现在可以使用 JSON 数据类型,这在使用 Angular.js 等框架时非常有用。

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

例如,我在数据库中保存了一个 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": "[email protected]", "E": "Female", "F": "Tsagaan-Ovoo"}, {"A": 2, "B": "Marc", "C": "Rasmussen", "D": "[email protected]", "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

mysql json
1个回答
8
投票

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

*other_fields*, {"A": 1, "B": "Debra", "C": "Peters", "D": "[email protected]", "E": "Female", "F": "Tsagaan-Ovoo"}
*other_fields*, {"A": 2, "B": "Marc", "C": "Rasmussen", "D": "[email protected]", "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

© www.soinside.com 2019 - 2024. All rights reserved.