mariadb SQL JOIN JSON对象中的每个ID

ippsafx7  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个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对象中的每一项。

uyto3xhc

uyto3xhc1#

JOIN开头

根据来自a user的评论,有一个更好的方法...

SQL语句

SELECT c.*
  FROM writers w
  JOIN cities c ON JSON_CONTAINS(w.projects, CONCAT('\"', c.project, '\"'))
  WHERE w.id = '8'
  ORDER BY c.name;

输出相同...

输出

| 标识符|姓名|投射|
| - -|- -|- -|
| 十三个|卡莱尔|四个|
| 2个|芝加哥|2个|
| 三个|思科公司|三个|
| 二十一个|埃弗雷特|三个|
| 十四|富格|五个|
| 五个|北部地区|五个|
| 20个|萨尔瓦多|2个|
| 四个|西雅图|四个|
| 十一|南部|2个|
| 十二个|东京市|三个|


相关问题