【问题标题】:MySQL-select and sort rows based on the keys and values of json arrayMySQL-根据json数组的键值对行进行选择和排序
【发布时间】:2021-07-08 10:16:05
【问题描述】:

我的数据库中有一个包含 2 列的表:iddata。一些信息以json格式保存在数据列中。例如:

id     data
---------------------------
1      [{"id":10,"score":0.68},{"id":20,"score":0.59}]
2      [{"id":15,"score":0.95},{"id":13,"score":0.89}]
...

现在我需要运行一个查询,它选择 id 存在于第一行的 json 数组中的行(即 id=10 或 id=20 的行),然后按中提到的分值对这些行进行排序json 数组。如何运行这样的查询?

expected output:

id
-----
20
10

【问题讨论】:

  • 你想要的输出是什么?
  • @TimBiegeleisen 更新了帖子并提到了。
  • 什么是精确 MySQL版本?
  • @Akina MariaDB 10.5.8

标签: mysql sql database select


【解决方案1】:

MariaDB 没有将 JSON 值解析为行集的函数(如 MySQL 中的 JSON_TABLE),因此请使用递归 CTE:

WITH RECURSIVE 
cte AS (
SELECT 0 num, JSON_EXTRACT(data, CONCAT('$[', 0, '].id')) id
FROM test
WHERE id = 1
UNION ALL
SELECT 1 + num, JSON_EXTRACT(data, CONCAT('$[', 1 + num, '].id'))
FROM test
CROSS JOIN cte
WHERE test.id = 1
  AND JSON_EXTRACT(data, CONCAT('$[', 1 + num, '].id')) IS NOT NULL
)
SELECT id FROM cte

https://dbfiddle.uk/?rdbms=mariadb_10.5&fiddle=8a1a8178eab2e6d3c4da51ae59a5d59d

如果每个 data 值在 JSON 数组中严格包含 2 个元素,那么您可以对索引进行硬编码:

SELECT JSON_EXTRACT(data, CONCAT('$[0].id')) id
FROM test
WHERE id = 1
UNION ALL
SELECT JSON_EXTRACT(data, CONCAT('$[1].id')) 
FROM test
WHERE id = 1

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 2017-09-29
    • 1970-01-01
    • 2020-12-15
    • 2011-04-05
    • 2014-08-21
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多