MySQL:在 JSON 字段上连接表并获取 JSON 数据

Posted

技术标签:

【中文标题】MySQL:在 JSON 字段上连接表并获取 JSON 数据【英文标题】:MySQL: Join table on JSON field and get JSON data 【发布时间】:2021-03-05 04:52:55 【问题描述】:

我想在 Grafana 中创建一个这样的表格面板:

+------------+--------------+------------------+
| Name       | Access level | Max Access level |
+------------+--------------+------------------+
| Tony Stark | 5            | 5                |
+------------+--------------+------------------+

这可以通过 SQL 查询来完成。我有 mysql 作为数据源。

我有称为机器和人员的数据库。 在 db 机器中,我有单个机器的表。

表格有 id 和 json 对象作为列。

machines.machine_1

+----+---------------------------------------------+
| id | payload (JSON)                              |
+----+---------------------------------------------+
| 1  |                                            |
|    |     "rack":                                |
|    |         "0":                               |
|    |             "internal": "20.42706840974966" |
|    |                                            |
|    |     ,                                      |
|    |     "personel":                            |
|    |         "id": "0xb7c9bd9bc1f7d852",         |
|    |         "access_level": "5",                |
|    |         "access_level_max": "5"             |
|    |     ,                                      |
|    |     "information":                         |
|    |         "ID": "machine_1"                   |
|    |                                            |
|    |                                            |
+----+---------------------------------------------+

然后我在 db personel 中有一张带有 personel 的表。

personel.personel

+----+--------------------+------------+------+-------+----------+----------+-------------+
| id | hex                | name       | post | shift | superior | location | designation |
+----+--------------------+------------+------+-------+----------+----------+-------------+
| 1  | 0xb7c9bd9bc1f7d852 | Tony Stark | CEO  | NULL  | NULL     | NULL     | NULL        |
+----+--------------------+------------+------+-------+----------+----------+-------------+

现在, 我需要根据来自 json 对象的十六进制键从 personel 表中获取数据 在 machine_1 中。

我设法这样做了:

SELECT
  name as "Name"
FROM personel.personel
  WHERE exists(
SELECT
    json_extract(payload, '$.personel.id')
FROM machines.machine_1 as Table_A
    ORDER BY arrived desc
LIMIT 1
)

我不知道,如何创建一个查询,这将导致 3 列,其中名称是从 personel.personel 读取的,由 machines.machine_1 中 json 对象的值十六进制标识,其余值直接来自machines.machine_1中的json对象。

+------------+--------------+------------------+
| Name       | Access level | Max Access level |
+------------+--------------+------------------+
| Tony Stark | 5            | 5                |
+------------+--------------+------------------+

如果这是处理此类事情的不正确方法,请告诉我。 我想我可以重做解决方案,但由于其他原因,我想坚持使用 JSON 对象。

感谢您的任何帮助。

最好的问候。

【问题讨论】:

【参考方案1】:

以下查询可以解决您的问题:

select 
    p.name as 'Name',
    JSON_UNQUOTE(payload->"$.personel.access_level") as 'Access level',
    JSON_UNQUOTE(payload->"$.personel.access_level_max") as 'Max Access level'
from machines
left join personel p on p.hex = JSON_UNQUOTE(payload->"$.personel.id");

试试SQLize.online

【讨论】:

非常感谢。我稍微改变了查询,所以现在看起来像这样。 select p.name, JSON_UNQUOTE(payload->"$.personel.access_level") AS 'Access level', JSON_UNQUOTE(payload->"$.personel.access_level_max") AS 'Max Access level' from machine_1 left join personel.personel p on p.hex = JSON_UNQUOTE(payload->"$.personel.id") ORDER BY 到达 desc LIMIT 1 再次谢谢你。最佳重播。

以上是关于MySQL:在 JSON 字段上连接表并获取 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

Mysql查询json数据特定key的值

获取json数据单个字段数据

遍历表并在 js/jquery 中创建一个数组

Mysql连接两个表并根据主键计算总记录

json对象如果有个字段没有key,要怎么写才能输出?

如何使用枢轴连接两个表并在一个表中组合两个字段