2017-08-09 145 views
0

表:相關信息Mysql的JSON路徑提取

id  | info 
------ | ------ 
1  | {"v1": "test", "v2": "work"} 

表:my_data

id  | name  | info_id 
------ | ------ | ------ 
1  | john  | 2 
2  | peter | 1 
3  | luc  | 2 

我想有以下輸出:

name  | art 
------ | ------ 
john  | work 
peter | test 
luc  | work 

我的問題是我不知道如何使用主查詢的值作爲json路徑。

現在,我有這樣的:

SELECT a.name, (SELECT info->>"$.v1" AS art FROM infos AS b) FROM my_data AS a 

可以肯定這顯示了所有 「測試」

的查詢必須是這樣的:

SELECT a.name, (SELECT info->>CONCAT("$.v", a.info_id) AS art FROM infos AS b) FROM my_data AS a 

這可能嗎?

+0

我們可以檢查你正在使用的是哪個版本的MySQL嗎?可能我是'舊學校'(我是),但我會非常想要*不*存儲json數據。 – Strawberry

+0

當然,版本是5.7.19 – BobderHund

回答

0

你可以試試以下(根據需要調整):

mysql> SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.7.19 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> DROP TABLE IF EXISTS `my_data`, `infos`; 
Query OK, 0 rows affected, 2 warnings (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `infos` (
    -> `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> `info` JSON NOT NULL 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `my_data` (
    -> `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> `name` VARCHAR(255) NOT NULL, 
    -> `info_id` BIGINT UNSIGNED NOT NULL 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO `infos` 
    -> (`info`) 
    -> VALUES 
    -> ('{"v1": "test", "v2": "work"}'); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO `my_data` 
    -> (`name`, `info_id`) 
    -> VALUES 
    -> ('john', 2), 
    -> ('peter', 1), 
    -> ('luc', 2); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> SELECT 
    -> `md`.`name`, 
    -> JSON_UNQUOTE(
    ->  JSON_EXTRACT(
    ->  `i`.`info`, 
    ->  CONCAT('$.v', `md`.`info_id`) 
    -> ) 
    -> ) `art` 
    -> FROM 
    -> `my_data` `md` 
    -> INNER JOIN `infos` `i` ON `i`.`id` = 1; 
+-------+------+ 
| name | art | 
+-------+------+ 
| john | work | 
| peter | test | 
| luc | work | 
+-------+------+ 
3 rows in set (0.00 sec) 

db-fiddle

+0

哇,這就是它。相當簡單的方法。 不錯。 – BobderHund