SQL加入JSON对象中的每个ID

发布于 2025-02-05 05:29:58 字数 2615 浏览 3 评论 0原文

我有一个json列,其中包含另一个表的col_values。我想从json对象中的每个项目中返回其他表的行。

如果这是int列,我将使用JOIN,但是我需要JOIN JSON中的每个条目目的。

拍摄:

作者

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

我需要 NAME for Mike的每个城市(ID = <代码> 8 )。

所需的结果:

这是我得到的,我需要得到的(按名称订单<代码>订单)。

输出

| 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 &gt;

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;


背景

如果它很重要,我需要继续使用json作为数据类型,因为使用此数据库的服务器端软件通常会读取该列,如果以JSON对象的形式表示该列。

通常,我只需在我的服务器端语言中进行几个数据库调用并通过该JSON对象迭代,但是对于许多数据库调用而言,这太昂贵了,尽管进行多个数据库呼叫的分页呼叫更加昂贵。

我需要单个数据库调用中的所有结果。因此,我需要加入,或以其他方式循环通过SQL中的JSON对象中的每个项目。

I have a JSON column containing col_values for another table. I want to return rows from that other table for each item in the JSON object.

If this was an INT column, I would use JOIN, but I need to JOIN every entry in the JSON object.

Take:

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       |

I need every city ordered by name for Mike (id=8).

Desired results:

This is what I'm getting and what I need to get (ORDER BY name).

Output :

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

Current query, but this can't be the best way...

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 with the above. Is there a better way to do this "properly"?


Background

If it matters, I need to keep using JSON as the datatype because my server-side software that uses this database normally reads that column best if presented as a JSON object.

I would normally just do several database calls and iterate through that JSON object in my server-side language, but that is way too expensive with so many database calls, notwithstanding that it is even more costly to do multiple database calls for pagination.

I need all the results in a single database call. So, I need to JOIN or otherwise loop through each item in the JSON object within SQL.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

揽月 2025-02-12 05:29:59

开始

per a 来自用户,有一种更好的方法...

sql &gt;

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

输出相同...

输出

ID名称项目
13Carlisle4
2芝加哥2
3Cisco3
Cisco 3 21Everett3
14Fugging5
5 5North5
20Salvador2
4Seattle4 Seattle 4
Seattle 4 11South2
South 2Tokyo3

< strong>

Start with JOIN

Per a comment from a user, there is a better way...

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;

Output is the same...

Output :

idnameproject
13Carlisle4
2Chicago2
3Cisco3
21Everett3
14Fugging5
5North5
20Salvador2
4Seattle4
11South2
12Tokyo3

DB Fiddle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文