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

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 软件工程小施同学


http://www.kler.cn/news/334737.html

相关文章:

  • C#串口温度读取
  • Spring Boot框架下的足球青训俱乐部后台开发
  • 【前沿 热点 顶会】NIPS 2024中目标检测有关的论文
  • 【报错】mac m1 gateway 报错
  • Prompt 模版解析:诗人角色的创意引导与实践
  • 3.JVM
  • 技术人生-AD域
  • 论文 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust
  • 自动驾驶系列—自动驾驶背后的数据通道:通信总线技术详解与应用场景分析
  • 银河麒麟桌面操作系统V10 SP1:取消安装应用的安全授权认证
  • Python和C++及MATLAB和R时间序列中数学物理金融气象运动和电子材料
  • (C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)
  • Linux进程调度和进程切换
  • leetcode面试题17.04:消失的数字(C语言版)
  • 【系统架构设计师】专题:系统分析和设计
  • 乌班图基础设施安装之Mysql8.0+Redis6.X安装
  • 【STM32开发之寄存器版】(三)-详解NVIC中断
  • 论文阅读:InternVL v1.5| How Far Are We to GPT-4V? 通过开源模型缩小与商业多模式模型的差距
  • SpringBoot在线教育平台:设计与实现的深度解析
  • Unity 快速定位到目标文件夹