MySQL:在JSON字段上加入表并获取JSON数据

昂德里奇·内德尔卡

我想在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表。

员工。

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

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

我设法做到这一点:

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从json对象中的十六进制值读取的machines.machine_1而其余的值则直接从中的json对象读取machines.machine_1

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

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

谢谢您的任何帮助。

最好的祝福。

斯拉瓦·罗热涅夫(Slava Rozhnev)

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

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尝试

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章