ThinkPHP A表和B表一对多关联,根据B表中符合条件记录的某个字段的值对A表数据进行排序。

server/2024/9/20 1:25:15/ 标签: php, FastAdmin

A表是简历表结构如下

CREATE TABLE `fa_resume` (`user_id` int(11) NOT NULL,`name` varchar(255) DEFAULT NULL COMMENT '姓名',`sex` enum('1','0') DEFAULT '1' COMMENT '性别:1=男,0=女',`birthday` date DEFAULT NULL COMMENT '出生年月',`shenfen` enum('1','2') DEFAULT '1' COMMENT '身份:1=职场人,2=学生',`qiuzhi_status` enum('1','2','3','4') DEFAULT '1' COMMENT '求职状态:1=离职-随时到岗,2=在职-月内到岗,3=在职-考虑机会,4=在职-暂不考虑',`xueli` enum('1','2','3','4','5','6','7','8') DEFAULT '1' COMMENT '学历:1=初中及一下,2=中专/技校,3=高中,4=大专,5=本科,6=硕士,7=博士,8=博士后',`gerenyoushi` text COMMENT '个人优势',`ziwojieshao` text COMMENT '自我介绍',`status` enum('1','2') DEFAULT '1' COMMENT '状态:1=显示,2=隐藏',`updatetime` bigint(11) DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='个人简历';

B表是VIP订单表结构如下

CREATE TABLE `fa_vip_order` (`id` int(11) NOT NULL AUTO_INCREMENT,`order_num` varchar(255) DEFAULT NULL COMMENT '订单号',`user_id` int(11) DEFAULT NULL COMMENT '用户',`sale_id` int(11) DEFAULT NULL COMMENT '套餐id',`name` varchar(255) DEFAULT NULL COMMENT '套餐名称',`price` decimal(10,2) DEFAULT NULL COMMENT '金额',`days` int(11) DEFAULT NULL COMMENT '增加天数',`call_num` int(11) DEFAULT NULL COMMENT '电话总次数',`residue_call_num` int(11) DEFAULT NULL COMMENT '剩余电话次数',`pay_type` enum('wechat','alipay') DEFAULT NULL COMMENT '支付方式:wechat=微信,alipay=支付宝',`pay_order_num` varchar(255) DEFAULT NULL COMMENT '支付单号',`pay_time` bigint(11) DEFAULT NULL COMMENT '支付时间',`status` enum('1','2') DEFAULT '1' COMMENT '状态:1=待支付,2=已支付',`expire_time` bigint(11) DEFAULT NULL COMMENT '到期时间',`createtime` bigint(11) DEFAULT NULL,`updatetime` bigint(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='工人VIP订单';

需求是开通会员的用户简历排到前面,且开通时间越早,排的越靠前。

代码如下

php">/*** 查询是否有会员,有会员返回会员开通时间,无费用默认9999999999* @param $user_id* @return string*/
function getPayTime(){return "(SELECT COALESCE((SELECT pay_timeFROM fa_vip_orderWHERE  status = '2'AND expire_time > UNIX_TIMESTAMP(NOW())AND r.user_id = user_idORDER BY pay_time ASCLIMIT 1),9999999999) AS order_weigh) as order_weigh";
}//简历列表方法$lists = Resume::alias('r')->join('user u', 'u.id = r.user_id')->where('r.status', '1')->where($where)->where('r.user_id', 'in', $user_ids)->field(array('r.*','u.nickname','u.avatar','u.mobile',getPayTime()))->order('order_weigh asc')->paginate();

SQL分析

( SELECT `r`.*, `u`.`nickname`, `u`.`avatar`, `u`.`mobile`,(SELECT COALESCE((SELECT pay_timeFROM fa_vip_orderWHERE  status = '2'AND expire_time > UNIX_TIMESTAMP(NOW())AND r.user_id = user_idORDER BY pay_time ASCLIMIT 1),9999999999) AS order_weigh) as order_weigh
FROM `fa_resume` `r`
INNER JOIN `fa_user` `u` ON `u`.`id` = `r`.`user_id`
ORDER BY `order_weigh` ASC )

逐行解释
外层查询:
( SELECT ... ):这是一个外层查询,用于获取 fa_resume 表中的记录,并进行排序。
选择列:
SELECT r.*, u.nickname, u.avatar, u.mobile:从 fa_resume 表 (r) 中选择所有列,以及 fa_user 表 (u) 中的 nickname, avatar, 和 mobile` 列。
内层子查询:
(SELECT COALESCE(...)):这是一个内层子查询,用于计算每个 user_id 的 pay_time 的最小值,并为不存在的 pay_time 赋予一个默认值 9999999999。
COALESCE(...):如果第一个参数为空,则返回第二个参数。这里用于防止 pay_time 不存在的情况。
内层的 SELECT pay_time 子查询用于找到每个 user_id 的符合条件的 pay_time 的最小值。
WHERE status = '2': 仅考虑 status 为 2 的记录。
AND expire_time > UNIX_TIMESTAMP(NOW()): 仅考虑 expire_time 大于当前时间的记录。
AND r.user_id = user_id: 仅考虑与 fa_resume 表中的 user_id 匹配的记录。
ORDER BY pay_time ASC: 按照 pay_time 升序排列。
LIMIT 1: 仅选择第一个结果(即 pay_time 最小的记录)。
表联结:
FROM fa_resume rINNER JOINfa_user uONu.id=r.user_id:联结 fa_resume 表 (r) 和 fa_user 表 (u),基于 fa_user的id和fa_resume的user_id` 的匹配关系。
排序:
ORDER BY order_weigh ASC: 根据 order_weigh 字段对结果进行升序排序。
总结
这条 SQL 查询语句的主要目的是根据 fa_vip_order 表中的 pay_time 字段来对 fa_resume 表中的记录进行排序。它通过内层子查询找到每个 user_id 的 pay_time 最小值,并在外层查询中将这些值与 fa_resume 表的记录进行联结,最后根据这些 pay_time 的最小值进行排序。如果某个 user_id 没有符合条件的 pay_time 记录,则使用默认值 9999999999 来替代。


http://www.ppmy.cn/server/109616.html

相关文章

深度学习速通系列:梯度消失vs梯度爆炸

梯度消失和梯度爆炸是深度学习中训练深层神经网络时常见的两个问题,它们影响网络的训练过程和性能。 梯度消失(Vanishing Gradient Problem) 定义:梯度消失是指在深层神经网络的反向传播过程中,由于链式法则&#xf…

MySQL集群基本概率

1、数据同步 MySQL自带Master-Slave数据同步模式,也就是主从同步模式。MySQL_A节点开启binlog日志文件后,MySQL_A上面执行的SQL语句(查询语句除外)都会被记录在binlog日志里面。MySQL_B节点通过订阅MySQL_A的binlog文件&#xff…

SparkSQL缓存的用法

前言 SparkSQL关于缓存的操作语句官方给了三种: CACHE TABLE(缓存表)UNCACHE TABLE(清除指定缓存表)CLEAR CACHE(清除所有缓存表)下面我们详细讲解这些语句的使用方法。 CACHE TABLE CACHE TABLE 语句使用给定的存储级别缓存表的内容或查询的输出。如果一个查询被缓存…

计算机毕业设计选题推荐-摇滚音乐鉴赏网站-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

学习日志29

论文阅读:IBM Q Experience as a versatile experimental testbed for simulating open quantum systems 引言部分: 引言部分首先介绍了开放量子系统的理论研究的重要性,这些理论描述了量子系统与其环境相互作用的动力学。这种理论对于理解量…

React实现路由,路由守卫

1. 下载install react-router-dom react中实现路由需要依赖react-router-dom实现,通过如下命令下载 npm install react-router-dom 2. 引入组件,实现路由逻辑 我们要引入react-router-dom包中的BrowserRouter,Route,Routes&am…

aspose.pdf实现图片转pdf

/*** 图片转pdf*/ public static void ImagesToPdf(){String folderPath "D:\\Desktop\\xuanku";File folder new File(folderPath);List<String> images new ArrayList<>();// 检查文件夹是否存在if (folder.exists() && folder.isDirectory…

5220条执业助理医师题库ACCESS\EXCEL数据库

今天这份数据库与《4820道西#医综合真题西医真题ACCESS数据库》、《4170条中#医综合真题中医真题ACCESS\EXCEL数据库》结构相同&#xff0c;包含5千多道真题。这个数据库包含3个表&#xff0c;一个是分类表&#xff08;SECTION_BEAN&#xff09;&#xff0c;一个是题库主表&…

Mybatis 潦草笔记

准备工作&#xff08;创建springboot工程、数据库表、实体类&#xff09;引入Mybatis的相关依赖&#xff0c;配置Mybatis&#xff08;数据库连接信息&#xff09;编写SQL语句&#xff08;注解/XML&#xff09; 创建springboot工程 选中两项 MyBatis Framework&#xff1a;My…

<数据集>遥感航拍飞机和船舶和识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;19973张 标注数量(xml文件个数)&#xff1a;19973 标注数量(txt文件个数)&#xff1a;19973 标注类别数&#xff1a;2 标注类别名称&#xff1a;[ship,plane] 序号类别名称图片数框数1ship17575416292plane239815…

Vue的状态管理——Vuex34Pinia

Vue3中Vuex的使用_vue3 vuex-CSDN博客 VueX详解_组合式vuex-CSDN博客 15分钟学会Pinia Vuex 3和4详解 Vuex 3 Vuex 3是Vue.js 2.x版本的状态管理库&#xff0c;它提供了一种集中式存储和管理组件状态的方式。以下是Vuex 3的一些关键特性&#xff1a; 状态集中管理&#x…

Java+Swing实现学生选课管理系统

JavaSwing实现学生选课管理系统 一、系统介绍二、系统展示1.课程查询2.课程添加3.退课 三、系统实现四、其他1.其它系统2.获取源码 一、系统介绍 本系统实现了学生登录和管理员登录&#xff0c;学生实现选课&#xff0c;查看已选课程&#xff0c;修改密码&#xff0c;查看学生…

精准删除:掌握SQL中的DELETE语句

精准删除&#xff1a;掌握SQL中的DELETE语句 在数据库管理中&#xff0c;数据的增删改查&#xff08;CRUD&#xff09;是基本操作。其中&#xff0c;DELETE语句是用于从数据库表中删除数据的重要工具。本文将详细解释如何使用SQL的DELETE语句来删除数据&#xff0c;并提供实际…

Promise方法介绍

Promise.all、Promise.race、Promise.allSettled 和 Promise.any 是 JavaScript 中用于处理多个 Promise 对象的几种方法。它们各自有不同的用途和行为&#xff1a; Promise.all: 接收一个 Promise 对象的数组作为参数。只有当所有的 Promise 都成功解决&#xff08;fulfilled&…

node中定义错误级别中间件

1.什么是错误级别中间件 错误级别中间件是在客户端请求时发生了问题&#xff0c;那么会导致web服务器崩溃掉&#xff0c;那么通过该中间件的处理就可以避免该问题 2.如何定义错误级别中间件 // 这是定义普通中间件的方式 function (req, res, next) {console.log("这是…

JDBC中的execute, executeQuery, 和 executeUpdate方法区别

JDBC中的execute, executeQuery, 和 executeUpdate方法区别 1、execute(String sql)2、executeQuery(String sql)3、executeUpdate(String sql) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、execute(String sql) 功能&#xff1a;执…

PhpStorm2024版设置自动换行(软换行)

Settings > Editor > General > Soft Wraps 选中并加上对应的文件

Redisson与Redis分布式锁

Redis分布式锁 Redis分布式锁是一种在分布式系统中用于确保多个进程对共享资源互斥访问的机制。它通常通过Redis的原子指令来实现&#xff0c;比如使用SETNX&#xff08;Set if Not eXists&#xff09;指令来设置键&#xff0c;如果键不存在则操作成功&#xff0c;可以认为获取…

深度学习 --- VGG16能让某个指定的feature map激活值最大化图片的可视化(JupyterNotebook实战)

VGG16能让某个指定的feature map激活值最大化图片的可视化 在前面的文章中&#xff0c;我用jupyter notebook分别实现了&#xff0c;预训练好的VGG16模型各层filter权重的可视化和给VGG16输入了一张图像&#xff0c;可视化VGG16各层的feature map。深度学习 --- VGG16卷积核的可…

Cesium源码解读之Viewer(全网最全)

今天我们来扒一扒cesium 的源码&#xff0c; 探寻一下底层的奥秘&#xff0c;我们平时工作中用的最多的应该就是var viewer new Cesium.Viewer(cesiumContainer);这句了但我们却很少去了解他底层是否如何实现的。 首先 我们可以通过Source/Cesium.js找到api 的入口 然后一步…