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

embedded/2024/9/20 1:30:51/ 标签: 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/embedded/103819.html

相关文章

10:在Linux环境下编程

在Linux环境下编程 1、一些重要基础的指令 1、一些重要基础的指令 ①mkdir:创建文件夹,但是好像不能在根目录 \ 里面创建文件夹。 mkdir c//创建一个名为c的文件夹②touch:创建文件,要带文件后缀名 touch 01.c//创建一个.c的文…

C++实现堆排序

堆排序 什么是堆 堆是一种叫做完全二叉树的数据结构,可以分为大顶堆和小顶堆。 堆的分类 大顶堆:每个结点的值都大于或者等于他的左右结点的值 小顶堆:每个结点的值都小于或者等于他的左右结点的值 下标为 i 的父节点下标: (i - 1) / 2…

vue开发|qs是什么?

介绍 qs是一个JavaScript库,主要用于查询字符串的解析和序列化。它提供了一些附加安全性的特性,是处理URL查询字符串(如将对象序列化为查询字符串或将查询字符串解析为对象)的理想工具。 主要功能和特点 1.qs.parse()&#xff…

C++领进门(第三讲)

目录 7.内联函数 7.1 概念 7.2 特征 8. auto关键字(C11) 8.1 auto简介 8.2 auto的使用细则 8.3 auto不能推导的场景 9. 基于范围的for循环(语法糖)(C11) 9.1 范围for的语法 9.2 范围for的使用条件 10. 指针空值nullptr(C11) 7.内联函数 7.1 概念 以inline修饰的函数…

Linux之shell脚本正则

正则表达式 用于搭配脚本或者命令使用极大的丰富了脚本的功能,所以在这里我们把它也归为shell脚本的一部分(作者个人为了方便大家看才这么分类的)。正则表达式就是通过特殊的符号或者命令来对需要处理数据进行筛选或者加工。 类型含义示例说明^匹配行首^abc以abc开…

设计模式-结构型模式-享元模式

1.享元模式定义 摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象; 1.1 享元模式优缺点 优点 极大减少内存中相似或相同对象数量,节约系统资源&#xff0c…

Web3常见概念

Layer0 到 Layer3 的对比差异 层级定义主要功能举例Layer0基础设施层 提供区块链底层技术和基础设施 Avalanche、Cosmos、Horizen、PolkadotLayer1区块链层提供主要区块链协议和功能,处理交易和智能合约以太坊、Polkadot、EOSLayer2协议增强层优化交易速度和费用&a…

软件测试学习笔记丨Pytest配置文件

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/31774 一、Pytest配置文件 1.1 pytest.ini的定义 pytest.ini是pytest的配置文件;可以修改pytest的默认行为;不能使用任何中文符号,包括汉字、空格、引号、…

webContextUnify的作用

为了更好理解spring.cloud.sentinel.webContextUnify的作用,我直接提供一个详细的场景,包括完整的目录结构和URL路径。 假设我们有两个微服务应用:用户服务(UserService)和商品服务(ProductService&#x…

c#透明悬浮球实现 从零开始用C#写一个桌面应用程序(三)

目标:透明悬浮球 记录日期:20240308 要求基础:C#语言基础部分事件与委托,c#桌面程序基础操作 注:可见前文 http://t.csdnimg.cn/9uWK8 今天开始做一个悬浮球软件。本以为最难的是让悬浮球的具体功能&#xff0c…

C#语言实现最小二乘法算法

最小二乘法(Least Squares Method)是一种常用的拟合方法,用于在数据点之间找到最佳的直线(或其他函数)拟合。以下是一个用C#实现简单线性回归(即一元最小二乘法)的示例代码。 1. 最小二乘法简介…

【STM32】FMC

FMC功能与FSMC类似,但比FSMC更强大,但仅在F4 / F7 / H7等高级一点的MCU上支持,F1不支持。虽然我的是F103,但顺便都看了。 大部分图片来源:正点原子HAL库课程 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目…

Django 使用Apscheduler执行定时任务

APScheduler是一个轻量级的Python库,用于调度作业(运行定时任务)。在Django中使用APScheduler,你可以设置定时任务,比如每天定时发送报告,或者定时清理无效数据。 以下是一个简单的例子,展示如…

嵌入式全栈开发学习笔记---Linux系统编程(多线程编程)

目录 多线程 线程(thread)理论 进程和线程的区别(面试重点) 线程的优势(面试重点) 多线程编程pthread 线程的创建pthread_create() 主线程等待子线程可以用pthread_join() 线程退出pthread_exit() …

计算机硬件的基本组成

文章目录 前言计算机的发展软件软件的发展 硬件硬件的发展 计算机硬件的基本组成早期冯诺依曼结构现代计算机结构工作原理主存储器运算器控制器 获取指令和分析指令的过程 前言 <<计算机组成原理>> <<操作系统>> <<计算机网络>> <<数…

Nginx 负载均衡详解

一、Nginx 简介 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器&#xff0c;以其轻量级、高并发、低内存消耗等特点著称。Nginx 不仅适用于静态资源的快速分发&#xff0c;还广泛应用于负载均衡、反向代理等场景。通过Nginx&#xff0c;可以轻松地构建一个高效、可靠且…

应用层协议(下)Https加密Http的秘密(含逻辑图解 简单易学 通俗易懂!)

绪论​ “如今我努力奔跑&#xff0c;不过是为了追上那个曾经被寄予厚望的自己 —— 约翰丶利文斯顿”&#xff0c;本章承接上章Http&#xff0c;没看过强烈建议看后再看本章&#xff0c;本章主要就是学习Https是干什么的并且去底层的学习Http的原理&#xff0c;将会讲到Https的…

【甲方安全建设】富文本编辑器XSS漏洞攻击及防御详析

原创文章,禁止转载。 文章目录 调研背景搭建TinyMCE富文本编辑器靶场富文本编辑器前端过滤富文本编辑器后端攻击后端弱过滤弱过滤1弱过滤2后端有效过滤从甲方的视角看动态安全调研背景 随着Web 2.0技术的普及,富文本编辑器在各种Web应用中得到了广泛应用,用户、网站管理员等…

搭建ELK-Filebeat采集系统日志

1、解压到/data/elk/filebeat mkdir -p /data/elk/filebeat tar -zxf filebeat-7.17.7-linux-x86_64.tar.gz -C /data/elk/filebeat --strip-components1 #--strip-components选项表示从目录级别上去除指定的前缀&#xff0c;以实现更加控制解压的效果 2、修改配置文件 vi /…

Python爬虫01

requests模块 文档 安装 pip/pip3 install requestsresponse.text 和 response.content的区别 1.response.text 等价于 response.content.decode("推测出的编码字符集")response.text 类型&#xff1a;str 编码类型&#xff1a;requests模块自动根据Http头部对…