[mysql]JSON 仅提取数组中的第一个元素,无论我在查询中的过滤器是什么
· 收录于 2023-09-24 06:03:08 · source URL
问题详情
所以在列中国家有两个数据,在 json [AX、JP] 中,我想显示国家JP,因为我的查询说 DESC。但是结果显示是AX,这是错误的,因为它应该显示JP。这是因为在我的查询中我输入了 $[0],所以无论我在查询中的过滤器是什么,它都会始终显示这个 json [AX, JP] 中的第一个元素,其中数组中的AX为 0。那么我应该如何修复这个美元部分 $[0],以便我可以过滤我的数据。
这是护照列的数据,此护照列内有国家数据
[{"status": 1, "country": "AX", "issued_date": "2022-07-05", "passport_no": "ABS123433NEW3", "expiration_date": "2000-06-07"}, {"status": 1, "country": "JP", "issued_date": "2022-05-01", "passport_no": "TK84773812NEW3", "expiration_date": "-"}]
这是查询
LEFT JOIN (
SELECT
employees.id AS emp_id,
JSON_UNQUOTE(JSON_EXTRACT(employees.passport, '$[0].country')) AS latest_passport_no
FROM
TAL.employees
WHERE
JSON_UNQUOTE(JSON_EXTRACT(employees.passport, '$[0].country')) IS NOT NULL
ORDER BY
JSON_UNQUOTE(JSON_EXTRACT(employees.passport, '$[0].country')) DESC
) AS latest_passports ON EMP.id = latest_passports.emp_id
最佳回答
您可以使用JSON_TABLE
从 employee.passport
数据中提取所有国家/地区
值。然后可以按降序排序,并返回最新值:
SELECT e.id, MAX(jt.country) AS latest_passport
FROM employees e
JOIN JSON_TABLE(e.passport,
'$[*]' COLUMNS(
country VARCHAR(2) PATH '$.country'
)
) AS jt
GROUP BY e.id
示例数据的输出:
id latest_passport
1 JP
演示 dbfiddle.uk