从 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
但遗憾的是我得到了这个结果:
首先,您将所有 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