我有一个JSON列,其中包含另一个表的col_values。我希望为JSON
对象中的每个项返回另一个表中的行。
如果这是一个INT
列,我会使用JOIN
,但是我需要对JSON
对象中的每个条目都使用JOIN
。
拿着:
writers
:
| id | name | projects (JSON) |
|:-- |:-----|:------------------|
| 1 | Andy | ["1","2","3","4"] |
| 2 | Hank | ["3","4","5","6"] |
| 3 | Alex | ["1","7","8","9"] |
| 4 | Joe | ["1","5","6","7"] |
| 5 | Ken | ["2","4","5","6"] |
| 6 | Zach | ["2","7","8","9"] |
| 7 | Walt | ["2","5","6","7"] |
| 8 | Mike | ["2","3","4","5"] |
cities
:
| id | name | project |
|:-- |:---------|:--------|
| 1 | Boston | 1 |
| 2 | Chicago | 2 |
| 3 | Cisco | 3 |
| 4 | Seattle | 4 |
| 5 | North | 5 |
| 6 | West | 6 |
| 7 | Miami | 7 |
| 8 | York | 8 |
| 9 | Tainan | 9 |
| 10 | Seoul | 1 |
| 11 | South | 2 |
| 12 | Tokyo | 3 |
| 13 | Carlisle | 4 |
| 14 | Fugging | 5 |
| 15 | Turkey | 6 |
| 16 | Paris | 7 |
| 17 | Midguard | 8 |
| 18 | Fugging | 9 |
| 19 | Madrid | 1 |
| 20 | Salvador | 2 |
| 21 | Everett | 3 |
我需要为Mike按name
排序的每个城市(id
= 8
)。
预期结果:
这是我得到的,也是我需要得到的(ORDER BY name
)。
输出:
| id | name | project |
|:---|:---------|:--------|
| 13 | Carlisle | 4 |
| 2 | Chicago | 2 |
| 3 | Cisco | 3 |
| 21 | Everett | 3 |
| 14 | Fugging | 5 |
| 5 | North | 5 |
| 20 | Salvador | 2 |
| 4 | Seattle | 4 |
| 11 | South | 2 |
| 12 | Tokyo | 3 |
当前查询,但这不是最好的方法...
SQL语句〉
SELECT c.*
FROM cities c
WHERE EXISTS (
SELECT 1
FROM writers w
WHERE JSON_CONTAINS(
w.projects, CONCAT('\"', c.project, '\"'))
AND w.id = '8'
)
ORDER BY c.name;
**DB Fiddle**与上面的一样。有没有更好的方法来“正确地”执行此操作?
背景
如果有必要,我需要继续使用JSON
作为数据类型,因为使用该数据库的服务器端软件通常最好读取以JSON对象表示的列。
我通常只执行几次数据库调用,然后用我的服务器端语言迭代JSON对象,但是,对于如此多的数据库调用,开销太大了,尽管为分页执行多个数据库调用的开销更大。
我需要在一次数据库调用中得到所有结果,因此,我需要在SQL中JOIN
或以其他方式循环遍历JSON对象中的每一项。
1条答案
按热度按时间uyto3xhc1#
以
JOIN
开头根据来自a user的评论,有一个更好的方法...
SQL语句〉
输出相同...
输出:
| 标识符|姓名|投射|
| - -|- -|- -|
| 十三个|卡莱尔|四个|
| 2个|芝加哥|2个|
| 三个|思科公司|三个|
| 二十一个|埃弗雷特|三个|
| 十四|富格|五个|
| 五个|北部地区|五个|
| 20个|萨尔瓦多|2个|
| 四个|西雅图|四个|
| 十一|南部|2个|
| 十二个|东京市|三个|