avatar

刘刚刚的blog

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

  • 首页
  • python
  • 大模型应用
  • 软件/工具导航页
  • 关于
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

Jun 18, 2025

一些开发中使用的 linux运维命令

查看目录下的文件或者文件夹大小 du -d 1 -h 杀死某些服务 pkill -f flask-search lsof -i :5000 | awk 'NR>1 {print $2}' | xargs kill -9

Jun 18, 2025

python包管理神器:UV

目前 UV 因其优势,已被大量的python开源项目使用。简单整理了一些命令,不到 UV 功能的 1/5,更多功能慢慢探索。 安装 # mac brew install uv ​ # win powershell -c "irm https://astral.sh/uv/install.ps1 |

Jun 8, 2025

ollama-大模型的部署与使用

linux curl -fsSL https://ollama.com/install.sh | sh 因为安装过程有使用github相关资源,国内访问会有问题,需要加速。或者使用docker进行安装。各大云平台都有提供docker加速方法。 ollama的所有命令 Available Comman

OLDER

开发效率提高的一些软件

NEWER

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

Recently Updated

  • 使用 claude api遇到的问题
  • 一些开发中使用的 linux运维命令
  • python包管理神器:UV
  • ollama-大模型的部署与使用
  • 为jupyter增加可选的python内核

Trending Tags

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

Contents

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

Using the Halo theme Chirpy