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

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

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订单';

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

代码如下

/*** 查询是否有会员,有会员返回会员开通时间,无费用默认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 来替代。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 更改网络ip地址时出现错误怎么办
  • 深度学习项目实践——qq聊天机器人(transformer)(二)配置环境与部署
  • 做影像组学+深度学习技术研究如何发表高分论文,案例解析
  • 常用Numpy操作(笔记整理)
  • (四)进入MySQL 【事务】
  • 力扣234题详解:回文链表的多种解法与模拟面试问答
  • 深入理解归并排序
  • Mybatis中的缓存
  • 前端路由与后端路由的区别和联系
  • fiddler抓包工具入门到入职之如何精准的定位前后端的bug
  • 巧用scss实现一个通用的媒介查询代码
  • 破圈之路——写在创作纪念日
  • 【软件测试专栏】认识软件测试、测试与开发的区别
  • 【3.9】贪心算法-解最低加油次数
  • 【机器学习】在 scikit-learn 中,有哪些特征编码方法?分布详细举例列出
  • Apache Pulsar 2.1 重磅发布
  • Apache Spark Streaming 使用实例
  • Docker容器管理
  • Linux Process Manage
  • Linux各目录及每个目录的详细介绍
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python_OOP
  • Redis 中的布隆过滤器
  • Spring声明式事务管理之一:五大属性分析
  • 力扣(LeetCode)56
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用docker-compose进行多节点部署
  • 【云吞铺子】性能抖动剖析(二)
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 通过调用文摘列表API获取文摘
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​【已解决】npm install​卡主不动的情况
  • ​如何在iOS手机上查看应用日志
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • $.ajax,axios,fetch三种ajax请求的区别
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1)Android开发优化---------UI优化
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (windows2012共享文件夹和防火墙设置
  • (八)c52学习之旅-中断实验
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (面试必看!)锁策略
  • (十一)图像的罗伯特梯度锐化
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)React组件、useState、组件样式
  • (一)Linux+Windows下安装ffmpeg
  • (一)UDP基本编程步骤