当前位置: 首页 > news >正文

thinkphp6入门(25)-- 分组查询 GROUP_CONCAT

假设表名为 user_courses,字段为 user_id 和 course_name,存储每个用户选修的课程,想查询每个学生选修的所有课程

图片

SQL 原生查询

SELECT user_id, GROUP_CONCAT(course_name) as courses FROM user_courses GROUP BY user_id;
ThinkPHP 代码实现

在 ThinkPHP 中,你可以使用查询构造器来实现类似的功能:


use think\facade\Db;// 查询每个用户选修的所有课程
$data = Db::name('user_courses')->field('user_id, GROUP_CONCAT(course_name) as courses') // 使用 GROUP_CONCAT 函数将课程合并->group('user_id') // 按 user_id 分组->select();// 输出结果
print_r($data);

解释:

  1. field('user_id, GROUP_CONCAT(course_name) as courses'):选择 user_id 和使用 GROUP_CONCAT 函数将 course_name 字段中该用户的所有课程组合成一个字符串,并命名为 courses

  2. group('user_id'):按 user_id 进行分组,确保每个用户只会有一行结果,并且课程会聚合到这一行中。

也可以使用模型查询

UserCourse.php

<?php
namespace app\model;use think\Model;class UserCourse extends Model
{// 设置当前模型对应的完整数据表名称protected $name = 'user_courses'; // 表名
}

use app\model\UserCourse;$data = UserCourse::field('user_id, GROUP_CONCAT(course_name) as courses')  // 聚合查询->group('user_id')  // 按用户分组->select();// 输出查询结果
print_r($data);

查询结果

返回的数据格式类似如下:

每个用户的 courses 字段是该用户选修的所有课程的组合,多个课程以逗号分隔。


[['user_id' => 1, 'courses' => 'Math,English,History'],['user_id' => 2, 'courses' => 'Physics,Chemistry'],['user_id' => 3, 'courses' => 'Biology,Geography,Math']
]

扩展:

如果你想按字母顺序排列每个用户的课程,可以在 GROUP_CONCAT 中使用 ORDER BY 进行排序:

use think\facade\Db;$data = Db::name('user_courses')->field('user_id, GROUP_CONCAT(course_name ORDER BY course_name ASC) as courses')->group('user_id')->select();print_r($data);

如果结果想以user_id为key

<?php
namespace app\controller;use app\BaseController;
use app\model\UserCourse;class Course extends BaseController
{public function index()
{// 查询每个用户选修的所有课程$data = UserCourse::field('user_id, GROUP_CONCAT(course_name) as courses')->group('user_id')->select()->toArray();// 使用 array_column 将 user_id 作为键$data = array_column($data, null, 'user_id');// 返回 JSON 数据return json($data);}
}

结果


[1 => ['user_id' => 1, 'courses' => 'Math,English,History'],2 => ['user_id' => 2, 'courses' => 'Physics,Chemistry'],3 => ['user_id' => 3, 'courses' => 'Biology,Geography,Math'],
]

如果想将字符串转为数组

// 将 courses 字段的字符串转换为数组
foreach ($data as &$item) {$item['courses'] = explode(',', $item['courses']);
}

by 软件工程小施同学

相关文章:

thinkphp6入门(25)-- 分组查询 GROUP_CONCAT

假设表名为 user_courses&#xff0c;字段为 user_id 和 course_name&#xff0c;存储每个用户选修的课程&#xff0c;想查询每个学生选修的所有课程 SQL 原生查询 SELECT user_id, GROUP_CONCAT(course_name) as courses FROM user_courses GROUP BY user_id; ThinkPHP 代码…...

小米 MIX FOLD工程固件 更换字库修复分区 资源预览与刷写说明

小米 MIX FOLD机型代号 :cetus 该手机搭载骁龙888旗舰处理器 。对于一些因为字库问题损坏导致的故障,更换字库后要先刷写对应的工程底层修复固件。绑定cpu后在写入miui量产固件。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此…...

Flutter全局统一自定义导航栏返回按钮

Flutter全局统一自定义导航栏返回按钮 在Flutter开发中&#xff0c;导航栏&#xff08;AppBar&#xff09;是用户界面的重要组成部分&#xff0c;它不仅提供了页面标题&#xff0c;还可能包含返回按钮、导航按钮等。默认情况下&#xff0c;每个Scaffold的AppBar都会包含一个返…...

微信图片的超能力:5大隐秘功能揭秘,让你成为信息处理大师

在数字化时代&#xff0c;微信已成为我们日常生活中不可或缺的通讯工具。 它不仅仅是聊天的平台&#xff0c;更是一个功能强大的信息处理工具。 今天&#xff0c;我们将揭秘微信中图片背后的五大隐秘功能&#xff0c;让你在使用微信时更加得心应手&#xff0c;成为信息处理的…...

python实现RC4加解密算法

RC4算法 一、算法介绍1.1 背景1.2 密钥调度算法(KSA)1.3 伪随机生成算法(PRGA) 二、代码实现三、演示效果 一、算法介绍 1.1 背景 RC4算法是由Ron Rivest在1987年为RSA数据安全公司设计的一种流密码算法&#xff0c;其安全性主要依赖于其密钥流的随机性和不可预测性。该算法因…...

BLE MESH学习2——自定义MESH网络架构思考

BLE MESH学习2——自定义MESH网络架构思考 基于对WCH CH582这款单片机的了解&#xff0c;其可以实现mesh配网、朋友节点、低功耗节点和中继节点的角色&#xff0c;基本功能无问题。在此基础上&#xff0c;考虑满足IoT需求的MESH架构设计&#xff0c;作为后续设计的“白皮书”。…...

路由器的工作机制

在一个家庭或者一个公司中 路由器的作用主要有两个(①路由–决定了数据包从来源到目的地的路径 通过映射表决定 ②转送–通过路由器知道了映射表 就可以将数据包从路由器的输入端转移给合适的输出端) 我们可以画一张图来分析一下&#xff1a; 我们好好来解析一下这张图&#x…...

Studying-多线程学习Part3 - condition_variable与其使用场景、C++11实现跨平台线程池

来源&#xff1a;多线程学习 目录 condition_variable与其使用场景 生产者与消费者模型 C11实现跨平台线程池 condition_variable与其使用场景 生产者与消费者模型 生产者-消费者模式是一种经典的多线程设计模式&#xff0c;用于解决多个线程之间的数据共享和协作问题。…...

开发自定义starter

环境&#xff1a;Spring Cloud Gateway 需求&#xff1a;防止用户绕过网关直接访问服务器&#xff0c;用户只需引入依赖即可。 1、创建项目 首先创建一个spring boot项目 2、配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xm…...

Vue2电商平台(五)、加入购物车,购物车页面

文章目录 一、加入购物车1. 添加到购物车的接口2. 点击按钮的回调函数3. 请求成功后进行路由跳转(1)、创建路由并配置路由规则(2)、路由跳转并传参(本地存储) 二、购物车页面的业务1. uuid生成用户id2. 获取购物车数据3. 计算打勾商品总价4. 全选与商品打勾(1)、商品全部打勾&a…...

众数信科 AI智能体政务服务解决方案——寻知智能笔录系统

政务服务解决方案 寻知智能笔录方案 融合民警口供录入与笔录生成需求 2分钟内生成笔录并提醒错漏 助办案人员二次询问 提升笔录质量和效率 寻知智能笔录系统 众数信科AI智能体 产品亮点 分析、理解行业知识和校验规则 AI实时提醒用户文书需注意部分 全文校验格式、内容…...

Redis篇(面试题 - 连环16炮)(持续更新迭代)

目录 目录 目录 &#xff08;第一炮&#xff09;一、Redis&#xff1f;常用数据结构&#xff1f; 1. 项目里面到了Redis&#xff0c;为什么选用Redis&#xff1f; 2. Redis 是什么&#xff1f; 3. Redis和关系型数据库的本质区别有哪些&#xff1f; 4. Redis 的线程模型…...

selenium元素定位

find_element和find_elements 元素定位有两个表达式&#xff0c;分别为find_element()和find_elements()&#xff0c;它们的不同点如下&#xff1a; find_element()&#xff1a;找出的为单个元素&#xff0c;若有多个元素为同一表达式&#xff0c;则默认定位第一个元素&#…...

美畅物联丨视频汇聚从“设”开始:海康威视摄像机设置详解

在运用畅联云平台进行视频汇聚与监控管理时&#xff0c;海康威视的安防摄像机凭借其卓越的性能与广泛的应用兼容性&#xff0c;成为了众多用户的首选产品。海康威视摄像机参数设置与调试对于实现高效的安防监控至关重要。今天&#xff0c;让我们一同深入学习海康摄像机的参数设…...

聊天机器人羲和的代码04

进一步完善和优化聊天机器人GUI,使其更加丰富和美观,采取了以下措施: 添加图标:为应用程序添加一个图标。 调整布局:进一步优化布局,使其更加美观。 增加样式:使用更多的样式和主题来提升视觉效果。 添加动画:增加加载动画以提高用户体验。 优化控件:使用更现代的控件…...

Linux安装配置Jupyter Lab并开机自启

文章目录 1、安装配置jupyter lab首先需要使用pip3安装&#xff1a;生成配置文件和密码&#xff1a; 2、设置开机自启首先通过which jupyter查询到可执行文件路径&#xff1a;设置自启服务&#xff1a; 1、安装配置jupyter lab 首先需要使用pip3安装&#xff1a; pip3 instal…...

Java基础——`UUID.randomUUID()` 方法详细介绍

这里写自定义目录标题 UUID.randomUUID() 方法详细介绍1. 概述2. UUID 的结构与格式UUID 的 128 位结构划分&#xff1a; 3. UUID.randomUUID() 方法详解3.1 方法签名3.2 使用示例3.3 生成原理3.4 随机数生成的范围3.5 随机字符的取值范围 4. UUID 的版本与特性4.1 UUID 版本 4…...

前端面试常见手写代码题【详细篇】

文章目录 前言&#xff1a;防抖节流函数柯里化函数组合instanceof 实现实现new操作符的行为深拷贝继承实现&#xff1a;手写Promise数组中常见函数的实现 前言&#xff1a; 在前端面试中&#xff0c;经常会遇到要求手写的代码的题目&#xff0c;主要是考察我们的编程能力、和对…...

当代最厉害的哲学家改名大师颜廷利:北京、上海、广州和深圳房价精准预测

在2024年国庆节期间&#xff0c;北京、上海、广州和深圳的房地产市场异常活跃。作为山东济南籍的国际易学权威颜廷利教授&#xff0c;连续收到了这些大城市客户的感谢信和电话。 来自北京的王先生在信中写道&#xff1a;“非常感谢颜廷利教授这几年来对我们的鼓励和支持。在经历…...

MySQL常用指令码

本文精心挑选了一系列MySQL指令码&#xff0c;助你提升资料库效率、解决常见问题&#xff0c;让你的资料储存体验更加高效、可靠。 常用功能指令码 1.汇出整个资料库 mysqldump - u 使用者名称- p – default - character - set latin1 资料库名>汇出的档名(资料库预设编…...

ascend-transformer-boost:Transformer加速库架构原理剖析

前言 我第一次在昇腾NPU上跑Llama-2-7B推理时&#xff0c;用的是PyTorch原生实现&#xff0c;跑出来的吞吐是18 tokens/s&#xff0c;跟官方宣称的29 tokens/s差了快一倍。翻了一圈文档&#xff0c;发现昇腾CANN其实自带了一个Transformer加速库——ascend-transformer-boost&a…...

从零开始:5分钟掌握Mermaid Live Editor,告别复杂图表绘制烦恼

从零开始&#xff1a;5分钟掌握Mermaid Live Editor&#xff0c;告别复杂图表绘制烦恼 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/…...

从elm-react-native学习React Native最佳实践:10个关键开发技巧

从elm-react-native学习React Native最佳实践&#xff1a;10个关键开发技巧 【免费下载链接】elm-react-native A react native app simulating eleme app&#xff0c;run ios and android. 项目地址: https://gitcode.com/gh_mirrors/el/elm-react-native 想要快速掌握…...

OpenClaw+Hermes +Vibe Coding本地部署|论文自动化|知识工作流

在人工智能快速重塑科研范式的背景下&#xff0c;大语言模型、Agent系统与自动化科研工作流&#xff0c;正在深刻改变文献阅读、代码开发、数据分析、论文写作与科研协作的底层方式。面对模型快速迭代、工具形态持续演进的新局面&#xff0c;科研人员亟需从“会使用AI”进一步升…...

Octree-GS终极指南:如何用LOD结构化3D高斯实现实时大规模场景渲染

Octree-GS终极指南&#xff1a;如何用LOD结构化3D高斯实现实时大规模场景渲染 【免费下载链接】Octree-GS [TPAMI 2025] Octree-GS: Towards Consistent Real-time Rendering with LOD-Structured 3D Gaussians 项目地址: https://gitcode.com/GitHub_Trending/oc/Octree-GS …...

AI人工智能行业的发展:从机器学习到深度学习的演变历程

在数字化浪潮席卷全球的当下&#xff0c;人工智能&#xff08;AI&#xff09;已然成为推动各行业变革的核心力量。对于软件测试从业者而言&#xff0c;深入了解AI从机器学习到深度学习的演变历程&#xff0c;不仅能把握技术发展脉络&#xff0c;更能为测试工作的智能化转型提供…...

Aube:下一代 Node.js 包管理器,性能远超 pnpm

好的&#xff0c;我已经为您整理了关于新一代 Node.js 包管理器 Aube 的详细介绍文章。文章基于您提供的摘要和 GitHub 仓库的详细文档&#xff0c;扩充了功能介绍、使用场景和命令参考&#xff0c;以形成一个完整的详情页面。 Aube&#xff1a;下一代 Node.js 包管理器&#x…...

英伟达816亿营收+国产2000亿参数图像模型:AI军备赛再升级

英伟达Q1&#xff1a;816亿美元营收&#xff0c;AI算力王依然碾压 大家好&#xff0c;我是LeafStay。 今天凌晨&#xff0c;英伟达交出了一份让全市场都松口气的财报。 2027财年Q1&#xff08;截至2026年4月&#xff09;&#xff0c;英伟达营收816亿美元&#xff0c;同比增长…...

宇视出入口相机抓拍调试速成方法

宇视出入口相机抓拍调试速成方法一、背景概述智慧园区、停车场等场景已普及宇视出入口抓拍相机&#xff0c;用于车辆出入管控与车牌识别。现场易受光照、车速、车道环境等影响&#xff0c;常出现漏抓、识别率低、画面模糊等问题。传统调试无标准、耗时长、上手门槛高&#xff0…...

Python 3.x 下修复MD5编码报错:手把手教你搞定BUUCTF那道‘丢失的MD5’题

Python 3.x下MD5编码报错全解析&#xff1a;从CTF实战到通用解决方案 当你在BUUCTF中遇到那道关于"丢失的MD5"的题目时&#xff0c;是否也曾被那个看似简单的编码错误困扰&#xff1f;这不仅仅是一道CTF题目的解法&#xff0c;更是Python 3.x版本中字符串处理机制变…...