数据库中的数据

从数据库查到的数据,是这种JSON格式,建和值都是双引号包裹

[[{id: 21,name: 'why',password: 'e10adc3949ba59abbe56e057f20f883e',createAt: 2024-03-11T06:55:35.000Z,updateAt: 2024-03-11T06:55:35.000Z}],[`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(30) NOT NULL UNIQUE_KEY,`password` VARCHAR(50) NOT NULL,`createAt` TIMESTAMP(19) NOT NULL,`updateAt` TIMESTAMP(19) NOT NULL ON UPDATE CURRENT_TIMESTAMP]
]

要解构[ ]返回这个,[values]

获取第一个是我们需要的,第二个不需要,是表数据的相关信息

例如

[{id: 21,name: 'why',password: 'e10adc3949ba59abbe56e057f20f883e',createAt: 2024-03-11T06:55:35.000Z,updateAt: 2024-03-11T06:55:35.000Z}
]

第二个是这样的[values,xxx ]

[{id: 21,name: 'why',password: 'e10adc3949ba59abbe56e057f20f883e',createAt: 2024-03-11T06:55:35.000Z,updateAt: 2024-03-11T06:55:35.000Z}
][`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(30) NOT NULL UNIQUE_KEY,`password` VARCHAR(50) NOT NULL,`createAt` TIMESTAMP(19) NOT NULL,`updateAt` TIMESTAMP(19) NOT NULL ON UPDATE CURRENT_TIMESTAMP
]

若要拿到数据的对象形式,前端需要的话把JSON对象转为字符串

还要解构[ ]

  {id: 21,name: 'why',password: 'e10adc3949ba59abbe56e057f20f883e',createAt: 2024-03-11T06:55:35.000Z,updateAt: 2024-03-11T06:55:35.000Z}

实操

-- 创建用户表
CREATE TABLE IF NOT EXISTS`user`(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) UNIQUE NOT NULL,
password VARCHAR(50) NOT NULL,
createAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updateAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 发表动态表
CREATE TABLE IF NOT EXISTS`moment`(
id int PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(1000) NOT NULL,
user_id INT NOT NULL COMMENT '评论者外键,来寻找评论者',
createAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updateAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY(user_id) REFERENCES user(id)
);

SELECT m.id id,m.content content, m.createAt createTime, m.updateAt updateTime,
JSON_OBJECT('id',u.id,'name',u.name,'createTime',u.createAt,'updateTime',u.updateAt) userFROM moment m LEFT JOIN user u ON m.user_id=u.id LIMIT 10 OFFSET 0;

根据外键组织数据

数据关系

一对一、一对多、多对多都是关系型数据库中常见的数据关系类型。以下是对每种关系的举例:

一对一关系

例子:一个公民有一个唯一的身份证。

  • 解释:在这个例子中,每个公民都与一个唯一的身份证相关联,同时每个身份证也只与一个公民相关联。这是一种典型的一对一关系。

一对多关系

例子:一个班级有多个学生。

  • 解释:在这个例子中,每个班级可以有多个学生,但每个学生只能属于一个班级。班级与学生之间形成了一对多的关系。

多对多关系

例子:一个学生可以选修多门课程,同时一门课程也可以被多个学生选修。

  • 解释:在这个例子中,学生和课程之间形成了多对多的关系。一个学生可以选择多门课程,而每门课程也可以被多个学生选择。这种关系通常需要通过中间表(例如选课表)来实现。

注意事项

  • 在设计数据库时,要根据实际需求确定实体之间的关系类型。
  • 对于多对多关系,通常需要使用一个额外的关联表来存储关系数据。
  • 在实际应用中,可能还需要考虑其他因素,如数据的完整性、查询效率等。

通过理解这些基本的数据关系类型,可以更好地设计和优化数据库结构,以满足实际应用的需求。

数据拼接

{"code": 0,"message": "查询成功","data": [{"id": 3,"content": "春天,是一个充满希望和梦想信息的季节。它让大地焕发出新的生机,让万物复苏。在这个季节里,我们可以x感受到生命的力量","createTime": "2024-03-11T15:41:33.000Z","updateTime": "2024-03-12T13:24:14.000Z","user": {"id": 21,"name": "why","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},"comments": [{"id": 1,"user": {"id": 21,"name": "why"},"comment": null,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 6,"user": {"id": 21,"name": "why"},"comment": null,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 7,"user": {"id": 21,"name": "why"},"comment": null,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 8,"user": {"id": 21,"name": "why"},"comment": 1,"content": "如果可能的话,将 SQL 语句分解为更小的部分,并逐一测试它们,以找到具体的错误位置。","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 18,"user": {"id": 21,"name": "why"},"comment": null,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"}]}]
}
-- 在此基础继续增加字段
-- 也可以分别查询,然后在代码中做拼接,合在一起
-- 6.1这样查询会出现问题,因为动态下评论有5条,左连接再左连接labels会重复5次
-- SELECT m.id id,m.content content, m.createAt createTime, m.updateAt updateTime,
-- JSON_OBJECT('id', u.id, 'name', u.name, 'createTime', u.createAt, 'updateTime', u.updateAt) user,
-- (
-- JSON_ARRAYAgg(JSON_OBJECT(
-- 'id',c.id,'content',c.content,'comment',c.comment_id,'createTime', u.createAt, 'updateTime', u.updateAt,
-- 'user',JSON_OBJECT('id',cu.id,'name',cu.name)
-- ))
-- ) comments,
-- (
-- JSON_ARRAYAGG(JSON_OBJECT(
-- 'id', l.id,'name',l.name,'createTime',l.createAt,'updateTime', l.updateAt
-- ))
-- ) labels
-- FROM moment m LEFT 
-- JOIN user u ON m.user_id=u.id 
-- LEFT JOIN comment c ON c.moment_id=m.id  
-- LEFT JOIN user cu  ON cu.id=c.user_id
-- LEFT JOIN moment_label ml ON ml.moment_id=m.id
-- LEFT JOIN label l ON l.id=ml.label_id
-- WHERE m.id=3
-- GROUP BY m.id;
-- 
-- 解决方案
-- 1.不要一次性查询,写两条SQL;2.
-- 2.写一条SQL,查询数据重复后去重操作;
-- 3.SQL完善

单独查询没问题

多个左连接会出现重复问题,会在后续字段基础上再拼接

产生重复问题

[{"id": 1,"name": "篮球","createTime": "2024-03-12 22:21:15.000000","updateTime": "2024-03-12 22:21:15.000000"},{"id": 8,"name": "电影","createTime": "2024-03-12 22:26:12.000000","updateTime": "2024-03-12 22:26:12.000000"},{"id": 9,"name": "Rap","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 10,"name": "动漫","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 1,"name": "篮球","createTime": "2024-03-12 22:21:15.000000","updateTime": "2024-03-12 22:21:15.000000"},{"id": 8,"name": "电影","createTime": "2024-03-12 22:26:12.000000","updateTime": "2024-03-12 22:26:12.000000"},{"id": 9,"name": "Rap","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 10,"name": "动漫","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 1,"name": "篮球","createTime": "2024-03-12 22:21:15.000000","updateTime": "2024-03-12 22:21:15.000000"},{"id": 8,"name": "电影","createTime": "2024-03-12 22:26:12.000000","updateTime": "2024-03-12 22:26:12.000000"},{"id": 9,"name": "Rap","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 10,"name": "动漫","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 1,"name": "篮球","createTime": "2024-03-12 22:21:15.000000","updateTime": "2024-03-12 22:21:15.000000"},{"id": 8,"name": "电影","createTime": "2024-03-12 22:26:12.000000","updateTime": "2024-03-12 22:26:12.000000"},{"id": 9,"name": "Rap","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 10,"name": "动漫","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 1,"name": "篮球","createTime": "2024-03-12 22:21:15.000000","updateTime": "2024-03-12 22:21:15.000000"},{"id": 8,"name": "电影","createTime": "2024-03-12 22:26:12.000000","updateTime": "2024-03-12 22:26:12.000000"},{"id": 9,"name": "Rap","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 10,"name": "动漫","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"}
]

正确的

SELECT m.id id,m.content content, m.createAt createTime, m.updateAt updateTime,
JSON_OBJECT('id', u.id, 'name', u.name, 'createTime', u.createAt, 'updateTime', u.updateAt) user,
(
SELECT JSON_ARRAYAgg(JSON_OBJECT(
'id',c.id,'content',c.content,'comment',c.comment_id,'createTime', u.createAt, 'updateTime', u.updateAt,
'user',JSON_OBJECT('id',cu.id,'name',cu.name)
))FROM comment c 
LEFT JOIN user cu ON c.user_id=cu.id
WHERE c.moment_id=m.id
) comments,
(
JSON_ARRAYAGG(JSON_OBJECT(
'id', l.id,'name',l.name,'createTime',l.createAt,'updateTime', l.updateAt
))
) labels
FROM moment m LEFT 
JOIN user u ON m.user_id=u.id LEFT JOIN moment_label ml ON ml.moment_id=m.id
LEFT JOIN label l ON l.id=ml.label_id
WHERE m.id=3
GROUP BY m.id;

结果

{"code": 0,"message": "查询成功","data": [{"id": 3,"content": "春天,是一个充满希望和梦想信息的季节。它让大地焕发出新的生机,让万物复苏。在这个季节里,我们可以x感受到生命的力量","createTime": "2024-03-11T15:41:33.000Z","updateTime": "2024-03-12T13:24:14.000Z","user": {"id": 21,"name": "why","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},"comments": [{"id": 1,"user": {"id": 21,"name": "why"},"comment": 1,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 6,"user": {"id": 21,"name": "why"},"comment": null,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 7,"user": {"id": 21,"name": "why"},"comment": null,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 8,"user": {"id": 21,"name": "why"},"comment": 1,"content": "如果可能的话,将 SQL 语句分解为更小的部分,并逐一测试它们,以找到具体的错误位置。","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"},{"id": 18,"user": {"id": 21,"name": "why"},"comment": null,"content": "使用 SQL 编辑器或 IDE 的语法高亮和错误检查功能来帮助识别潜在的错误","createTime": "2024-03-11 14:55:35.000000","updateTime": "2024-03-11 14:55:35.000000"}],"labels": [{"id": 1,"name": "篮球","createTime": "2024-03-12 22:21:15.000000","updateTime": "2024-03-12 22:21:15.000000"},{"id": 8,"name": "电影","createTime": "2024-03-12 22:26:12.000000","updateTime": "2024-03-12 22:26:12.000000"},{"id": 9,"name": "Rap","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"},{"id": 10,"name": "动漫","createTime": "2024-03-13 10:48:45.000000","updateTime": "2024-03-13 10:48:45.000000"}]}]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538841.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.2 RK3399项目开发实录-初次使用的环境搭建(物联技术666)

通过百度网盘分享的文件:嵌入式物联网单片… 链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd8qo1 提取码:8qo1 复制这段内容打开「百度网盘APP 即可获取」 1. 用户和密码 1.1. Ubuntu Desktop 系统 Ubuntu Desktop 系统开机启动后,自动登录…

图片或视频充当网页背景+过渡动画

这是目前的主页预览图。上一个版本带有学校logo,根据比赛规则,删掉了学校logo。 图片背景 也就是将图片作为背景。 这个需求产生的场景是:如果直接用img标签显示界面左上角的logo,那么鼠标右键是可以直接选中图片的&#xff0c…

DirectPV的故事

2020 年,MinIO 为基于 Kubernetes 的 MinIO 存储部署实施了直接持久卷 (DirectPV)。DirectPV 类似于 LocalPV,但动态预配。 在这篇文章中,我将介绍创建 DirectPV 的有趣设计决策。但在深入了解设计细节之前&#xff0c…

Logseq电脑端+安卓端同步gitee或github

文章目录 0.初衷1.电脑端1.1 新建仓库1.2 克隆项目,生成秘钥1.3 添加图谱,选择文件目录,我是原本就有笔记,所以会如下所示。1.4 下载脚本文件1.5赋权限 (windows可跳过)1.6 修改脚本命令1.7 logseq设置同步…

es 聚合操作(二)

书接上文,示例数据在上一篇,这里就不展示了 一、Pipeline Aggregation 支持对聚合分析的结果,再次进行聚合分析。 Pipeline 的分析结果会输出到原结果中,根据位置的不同,分为两类: Sibling - 结果和现有…

CentOS无法解析部分网站(域名)

我正在安装helm软件,参考官方文档,要求下载 get-helm-3 这个文件。 但是我执行该条命令后,报错 连接被拒绝: curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # curl: (7) Fai…

2.MongoDB与关系数据库对比

MongoDB的简单操作与比较 与关系数据库对比 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,来看看他们之…

两个高斯分布的KL散度绘制动画

KL散度 KL散度用于衡量两个变量分布之间的差异性 K L ( P ∣ ∣ Q ) ∫ − ∞ ∞ p ( x ) log ⁡ p ( x ) q ( x ) d x (1) KL(P\ ||\ Q)\int_{-\infty}^{\infty}p(x)\log\frac{p(x)}{q(x)}dx\tag{1} KL(P ∣∣ Q)∫−∞∞​p(x)logq(x)p(x)​dx(1) P、Q为随机变量X的两个概…

经典数组和指针笔试题解析——C语言

【本节内容】 1. 数组和指针笔试题解析 2. 指针运算笔试题解析 1. 数组和指针笔试题解析 1.1 一维数组 #include <stdio.h> int main() {int a[] { 1,2,3,4 };printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(a 0));printf("%zd\n&qu…

Docker常见指令

1.docker search mysql &#xff1a;从docker镜像仓库搜索和mysql有关的镜像 docker search mysql 2.docker pull mysql &#xff1a;从docker仓库拉取mysql镜像 docker pull mysql 3.docker run mysql &#xff1a;启动mysql镜像 docker run mysql 4.docker ps &#xff…

消除PyCharm的黄色波浪线和右侧黄色短线

旧版pycharm看这个链接&#xff1a;https://blog.csdn.net/weixin_39450145/article/details/113574921 新版pycharm往下看 消除代码中的黄色波浪线&#xff1a;在设置&#xff0c;编辑器&#xff0c;配色方案&#xff0c;常规里面。然后选择错误和警告。 消除右侧黄色短线&am…

msfconsole数据库连接不了的问题【已解决】

msfconsole数据库连接 1.msf数据库端口 msf使用的是postgresql&#xff0c;这个数据库默认端口是5432 单个模块的使用可以不需要数据库&#xff0c;但是模块与模块之间需要沟通的时候就会用到数据库。 2.查看msf数据库连接状态 db_status #msf内部查看systemctl status p…