MySQL:连接JSON字段上的表并获取JSON数据
我想在Grafana中创建一个这样的表格面板:MySQL:连接JSON字段上的表并获取JSON数据,mysql,sql,grafana,Mysql,Sql,Grafana,我想在Grafana中创建一个这样的表格面板: +------------+--------------+------------------+ | Name | Access level | Max Access level | +------------+--------------+------------------+ | Tony Stark | 5 | 5 | +------------+--------------+-
+------------+--------------+------------------+
| Name | Access level | Max Access level |
+------------+--------------+------------------+
| Tony Stark | 5 | 5 |
+------------+--------------+------------------+
这可以通过SQL查询完成。我有MySQL作为数据源
我有一个叫做机器和人员的数据库。
在db机器内部,我有用于单个机器的表
该表以id和json对象作为列
机器
+----+---------------------------------------------+
| id | payload (JSON) |
+----+---------------------------------------------+
| 1 | { |
| | "rack": { |
| | "0": { |
| | "internal": "20.42706840974966" |
| | } |
| | }, |
| | "personel": { |
| | "id": "0xb7c9bd9bc1f7d852", |
| | "access_level": "5", |
| | "access_level_max": "5" |
| | }, |
| | "information": { |
| | "ID": "machine_1" |
| | } |
| | } |
+----+---------------------------------------------+
然后我有一张桌子,里面有个人
个人,个人
+----+--------------------+------------+------+-------+----------+----------+-------------+
| id | hex | name | post | shift | superior | location | designation |
+----+--------------------+------------+------+-------+----------+----------+-------------+
| 1 | 0xb7c9bd9bc1f7d852 | Tony Stark | CEO | NULL | NULL | NULL | NULL |
+----+--------------------+------------+------+-------+----------+----------+-------------+
现在,,
我需要根据json对象的十六进制键从personel表中获取数据
在机器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\u 1
中json对象的十六进制值标识,其余值直接来自machines.machine\u 1
中的json对象
+------------+--------------+------------------+
| Name | Access level | Max Access level |
+------------+--------------+------------------+
| Tony Stark | 5 | 5 |
+------------+--------------+------------------+
如果这是一个不正确的方式如何处理这种事情,请让我知道。
我想我可以重做这个解决方案,但由于其他原因,我希望坚持使用JSON对象
谢谢你的帮助
致以最诚挚的问候。以下查询可以解决您的问题:
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");
试穿一下非常感谢。我把问号改了一点,所以现在看起来像这样。选择p.name,JSON_UNQUOTE(有效载荷->“$.personel.access_level”)作为“访问级别”,jsonquote(有效载荷->“$.personel.access_level_max”)作为“最大访问级别”,从machine_1左侧加入personel.personel p on p.hex=JSON_UNQUOTE(有效载荷->“$.personel.id”),订单到达描述限制1再次感谢。最好的重播。