INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN这四个怎么在gorm中使用

news2025/1/3 2:46:35

在 GORM 中,JOIN 操作是通过 Joins 方法实现的,而不同类型的 JOIN(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN)可以通过特定的 SQL 语法来表示。GORM 本身并没有直接的 INNER, LEFT, RIGHT 等专用方法,但可以通过使用 Joins 和 SQL 来实现这几种 JOIN 操作。

1. INNER JOIN
INNER JOIN 是默认的 JOIN 类型,因此在 GORM 中,只需要使用 Joins 方法即可。

示例:
假设你有两张表 users 和 orders,我们想要获取所有有订单的用户:

db.Joins("JOIN orders ON orders.user_id = users.id").Find(&users)

解释:这是一个典型的 INNER JOIN,只返回 users 和 orders 中匹配的记录。

2. LEFT JOIN
要执行 LEFT JOIN,可以在 Joins 中明确指定 LEFT JOIN 语句。

示例:
假设你想要查找所有用户,即使他们没有订单(未匹配的订单记录用 NULL 填充):

db.Joins("LEFT JOIN orders ON orders.user_id = users.id").Find(&users)

解释:LEFT JOIN 返回 users 表中的所有记录,即使 orders 表中没有匹配的 user_id。

3. RIGHT JOIN
虽然 RIGHT JOIN 较为少用,但如果需要的话,也可以通过指定 RIGHT JOIN 的 SQL 实现。

示例:
假设你想要查找所有订单,即使某些订单没有对应的用户:

db.Joins("RIGHT JOIN orders ON orders.user_id = users.id").Find(&orders)

解释:RIGHT JOIN 返回 orders 表中的所有记录,即使 users 表中没有匹配的 id,未匹配的用户信息用 NULL 填充。

4. FULL JOIN
GORM 不直接支持 FULL JOIN,因为它依赖于底层数据库的支持。通常可以通过两次 LEFT JOIN 和 RIGHT JOIN 并用 UNION 合并来实现。不过,许多数据库(例如 MySQL)并不支持 FULL JOIN,如果你使用 PostgreSQL 或其他支持 FULL JOIN 的数据库,可以直接使用 SQL:

示例:

db.Raw(`
    SELECT users.*, orders.*
    FROM users
    FULL JOIN orders ON orders.user_id = users.id
`).Scan(&results)

解释:Raw 允许你直接执行原始 SQL 查询,因此可以通过 FULL JOIN 语法来获取所有用户和订单,包括未匹配的记录。

5. 自定义查询中的 Select
你可以通过 Select 方法结合 JOIN 来选择特定的字段,避免返回不必要的数据。

示例:

db.Table("users").Select("users.name, orders.item").
    Joins("LEFT JOIN orders ON orders.user_id = users.id").
    Find(&results)

解释:返回 users 表中的 name 和 orders 表中的 item 字段,即使某些用户没有订单。

总结
在 GORM 中,JOIN 类型主要通过 SQL 语法指定:

  • INNER JOIN:默认使用 Joins(“JOIN …”)。
  • LEFT JOIN:使用 Joins(“LEFT JOIN …”)。
  • RIGHT JOIN:使用 Joins(“RIGHT JOIN …”)。
  • FULL JOIN:通过 Raw 方法执行原生 SQL。
    你可以根据需求选择合适的 JOIN 类型来构建查询。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1230作业

思维导图 作业 将广播发送和接收端实现一遍&#xff0c;完成一个发送端发送信息&#xff0c;对应多个接收端接收 自实验 //广播发送端 #include <myhead.h> #define G_PORT 8765 #define G_IP "192.168.124.255" int main(int argc, const char *argv[]) {//…

U盘格式化工具合集:6个免费的U盘格式化工具

在日常使用中&#xff0c;U盘可能会因为文件系统不兼容、数据损坏或使用需求发生改变而需要进行格式化。一个合适的格式化工具不仅可以清理存储空间&#xff0c;还能解决部分存储问题。本文为大家精选了6款免费的U盘格式化工具&#xff0c;并详细介绍它们的功能、使用方法、优缺…

Windows系统使用Koodo Reader轻松搭建在线私人图书馆远程看书

文章目录 前言1. Koodo Reader 功能特点1.1 开源免费1.2 支持众多格式1.3 多平台兼容1.4 多端数据备份同步1.5 多功能阅读体验1.6 界面简洁直观 2. Koodo Reader安装流程2.1 安装Git2.2 安装Node.js2.3 下载koodo reader 3. 安装Cpolar内网穿透3.1 配置公网地址3.2 配置固定公网…

开关电源调试思维导图

开关电源辐射发射问题调试一直以来都是工程师们非常头疼的事情&#xff0c;也不知道如何下手&#xff0c;今天就通过几个思维导图把开关电源辐射发射问题调试的思路呈现给广大工程师们&#xff0c;希望能照亮大家辐射调试的黑暗道路。 01、反激电路辐射发射问题调试思维导图 0…

【brainpan靶场渗透】

文章目录 一、基础信息 二、信息收集 三、反弹shell 四、提权 一、基础信息 Kali IP&#xff1a;192.168.20.146 靶机 IP&#xff1a;192.168.20.155 二、信息收集 似乎开放了9999&#xff0c;10000端口&#xff0c;访问页面没有太多内容&#xff0c;扫描一下目录 dirs…

使用MFC编写一个paddleclas预测软件

目录 写作目的 环境准备 下载编译环境 解压预编译库 准备训练文件 模型文件 图像文件 路径整理 准备预测代码 创建预测应用 新建mfc应用 拷贝文档 配置环境 界面布局 添加回cpp文件 修改函数 报错1解决 报错2未解决 修改infer代码 修改MFCPaddleClasDlg.cp…

html+css+js网页设计 美食 美食家6个页面

htmlcssjs网页设计 美食 美食家6个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

【第四期书生大模型实战营基础岛】L1G5000——XTuner 微调个人小助手认知任务

基础任务————使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知&#xff0c;如下图所示&#xff08;图中的尖米需替换成自己的昵称&#xff09;&#xff0c;记录复现过程并截图。 环境配置与数据准备 步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境 cd …

android知识巩固(二.非线性数据结构)

非线性结构:是从逻辑结构上划分,其元素存在一对多或者多对多的相互关系 1.前言 在前一章中,我们了解了数据结构的基本思想,学习了部分基本的线性数据结构,了解了计算机是如何表示和存储数据的,良好的数据结构思想有助于我们写出性能优良的应用 2.目录 目录.png 3.非线性数据结构…

列车票务信息系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

LabVIEW中实现多个Subpanel独立调用同一个VI

在LabVIEW中&#xff0c;如果需要通过多个Subpanel同时调用同一个VI并让这些VI实例独立运行&#xff0c;可以通过以下方法实现&#xff1a; 1. 问题背景 LabVIEW默认的VI是以单实例方式运行的。当将同一个VI加载到多个Subpanel时&#xff0c;会因为共享同一内存空间而导致冲突…

鱼眼相机模型与去畸变实现

1.坐标系说明 鱼眼相机模型涉及到世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系。对于分析鱼眼相机模型&#xff0c;假定世界坐标系下的坐标点,经过外参矩阵的变换转到相机坐标系&#xff0c;相机坐标再经过内参转换到像素坐标&#xff0c;具体如下 进一步进…

基于eBPF的微服务网络安全(Cilium 1)

一些开源的kubernetes工具已经开始使用eBPF&#xff0c;这些工具大多数与网络&#xff0c;监控和安全相关。 本文不会涵盖eBPF的方方面面&#xff0c;只作为一个入门指南&#xff0c;包括Linux内核的BPF概念&#xff0c;到将该功能加入到微服务环境的优势&#xff0c;以及当前…

我的JAVA-Web进阶--Maven

1.Maven功能 依赖管理和项目构建 2.Maven仓库 3.Maven项目构建 4.Maven依赖管理 依赖配置 依赖冲突 理解&#xff1a;层级指的是dependency的每一个包的树状图的深度&#xff0c;每一个包都向右延伸一个树状图&#xff0c;层级越深优先级越低&#xff0c;层级越浅&#xff0…

020-spring-整合web

引入web包。通过 ContextLoaderListener 在启动的时候加载spring.xml 加载spring.xml 之后&#xff0c;把dao层等对象放在容器中 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.…

Kotlin Multiplatform 新纪元:klibs.io 与鸿蒙支持解锁跨平台开发新潜力

Kotlin Multiplatform 新纪元:klibs.io 与鸿蒙支持解锁跨平台开发新潜力 在软件开发日益多元化的今天,Kotlin Multiplatform(KMP) 正凭借其跨平台代码复用能力迅速成为开发者的首选工具之一。2024年,KMP生态系统的库数量激增了35%,标志着这一领域的强劲增长。然而,随着…

Qt从入门到入土(七)-实现炫酷的登录注册界面(下)

前言 Qt从入门到入土&#xff08;六&#xff09;-实现炫酷的登录注册界面&#xff08;上&#xff09;主要讲了如何使用QSS样式表进行登录注册的界面设计&#xff0c;本篇文章将介绍如何对登录注册界面进行整体控件的布局&#xff0c;界面的切换以及实现登录、记住密码等功能。…

【阅读笔记】《基于区间梯度的联合双边滤波图像纹理去除方法》

一、联合双边滤波背景 联合双边滤波&#xff08;Joint Bilateral Filter, JBF&#xff09;是一种图像处理技术&#xff0c;它在传统的双边滤波&#xff08;Bilateral Filter, BF&#xff09;基础上进行了改进&#xff0c;通过引入一个引导图&#xff08;guidance image&#x…

Dockerfile基础指令

1.FROM 基于基准镜像&#xff08;建议使用官方提供的镜像作为基准镜像&#xff0c;相对安全一些&#xff09; 举例&#xff1a; 制作基准镜像&#xff08;基于centos:lastest&#xff09; FROM cenots 不依赖于任何基准镜像 FROM scratch 依赖于9.0.22版本的tomcat镜像 FROM…

Linux实验报告9-进程管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)列出当前系统中的所有进程,如何观察进程的优先级? (2)查看当前终端运行的 bash 进程的 PID,在当前终端启动 vim 编辑器并让其在后台执行,然后列出在当前终端中执行的进程的家族树。 (3)请自行挂载U盘或光盘,然后…