avatar

刘刚刚的blog

采菊东篱下,悠然见南山🦥

  • 首页
  • 大模型应用
  • 常用软件/工具
  • Halo
  • 关于
Home 常用的一些特殊的sql整理
文章

常用的一些特殊的sql整理

Posted 2023-04-13 Updated 2024-09- 27
By Administrator
20~25 min read

JSON_CONTAINS,一对多时关联字段为使用逗号拼接的id

多对多的关系中,我们也可以不是用中间表来存储关联信息,而将其简化为类似‘一对多’的效果。

比如:书和作者的对应关系中,一本书对应多个作者,一个作者对应多本书,正常建表的话,我们应该有三张表:书、作者、书和作者的中间表。我们也可以将作者的信息存储到书的表中,在书的表中新增一个字段来存储作者的信息,多个作者之间使用逗号隔开,如图。

书

id

name

authors

1

书名1

1,2,

2

书名2

1,3,

作者

id

name

1

作者1

2

作者2

3

作者3

使用JSON_CONTAINS进行表的关联

查询书及作者的信息,通过JSON_CONTAINS来进行关联

SELECT 
    *
FROM book b 
    LEFT JOIN author a ON JSON_CONTAINS(b.AUTHORS, concat(a.id))
ORDER BY b.id

+----+---------+---------+------+---------+
| id | name    | authors | id   | name    |
+----+---------+---------+------+---------+
|  1 | 书名1   | [1,2]   |    1 | 作者1   |
|  1 | 书名1   | [1,2]   |    2 | 作者2   |
|  2 | 书名2   | [1,3]   |    1 | 作者1   |
|  2 | 书名2   | [1,3]   |    3 | 作者3   |
+----+---------+---------+------+---------+

使用group_concat对JSON_CONTAINS的字段进行拼接

使用group_concat将name进行拼接

    SELECT 
        b.id,b.name,group_concat(DISTINCT a.name) as author_names
    FROM book b 
        LEFT JOIN author a ON JSON_CONTAINS(b.AUTHORS, concat(a.id))
    GROUP BY b.id
    ORDER BY b.id

    +----+---------+-----------------+
    | id | name    | author_names    |
    +----+---------+-----------------+
    |  1 | 书名1   | 作者1,作者2     |
    |  2 | 书名2   | 作者1,作者3     |
    +----+---------+-----------------+

使用concat、group_concat将数据拼接为json对象

# 正常拼接
SELECT b.id,
       b.NAME,
       concat(
               '[',
               group_concat(DISTINCT  json_object(
                                                  'id', a.id,
                                                  'name', a.name
                                      )
                   ),
               ']'
           ) AS author_names
FROM book b
         LEFT JOIN author a ON JSON_CONTAINS(b.AUTHORS, CONCAT(a.id))
GROUP BY b.id
ORDER BY b.id;


# 通过case when then 来处理无关联对象时的情况
SELECT b.id,
       b.NAME,
       concat(
               '[',
               group_concat(DISTINCT (CASE
                                          WHEN a.id
                                              THEN json_object(
                                                  'id', a.id,
                                                  'name', a.name
                                              )
                   END)),
               ']'
           ) AS author_names
FROM book b
         LEFT JOIN author a ON JSON_CONTAINS(b.AUTHORS, CONCAT(a.id))
GROUP BY b.id
ORDER BY b.id;

+----+---------+-------------------------------------------------------------+
| id | NAME    | author_names                                                |
+----+---------+-------------------------------------------------------------+
|  1 | 书名1   | [{"id": 1, "name": "作者1"},{"id": 2, "name": "作者2"}]     |
|  2 | 书名2   | [{"id": 1, "name": "作者1"},{"id": 3, "name": "作者3"}]     |
+----+---------+-------------------------------------------------------------+

编程相关
License:  CC BY 4.0
Share

Further Reading

May 7, 2025

文本切分-语义分割(Semantic Chunking)

当我们使用固定长度的块大小或者一些标点符号分割文本时,其并没有考虑到块中内容的连贯性与完整性。我们可以借助 embedding 来来对文本中语义相近的句子进行聚类。 可以考虑的方法包括: 层次聚类与位置奖励:如果只使用层次聚类 (逐个的将所有句子进行聚类),当一个长句之后存在一个短句时,会存在一些问

Apr 29, 2025

dify 并发配置优化

以 docker compose 部署为例,以下是一些常用的参数优化(修改后注意观察服务器负载): 数据库连接数 当把工作流发布为工具,进行并发调用时,容易导致数据库连接失败。 # 配置文件路径:docker/.env # 每个 dify服务进程的数据库链接池数量 SQLALCHEMY_POOL_S

Apr 21, 2025

Typing

类型注释让python 有了更好的编辑器提示功能。 基础使用 对函数参数和返回值,进行类型注释 def surface_area_of_cube(edge_length: float) -> str:    return f"The surface area of the cube is {6 *

OLDER

开发效率提高的一些软件

NEWER

准备学习 《C Primer Plus》的一些想法

Recently Updated

  • 文本切分-语义分割(Semantic Chunking)
  • dify 并发配置优化
  • Typing
  • 大模型返回中json_schema与json_mode的区别
  • Async

Trending Tags

Halo 运维 postgresql 设计模式 linux就该这么学 nas rag odoo python 文本切分

Contents

©2025 刘刚刚的blog. Some rights reserved.

Using the Halo theme Chirpy