MySQL同时in俩个字段;根据多个字段分组并且获取分组内的某个字段最大值所对应的信息

需求:根据一批ids,找到这批ids所在的产线型号里每个产线型号对应的最大的版本号的id,版本号,产线,型号等信息

表结构:

DROP TABLE IF EXISTS `craft_version`;
CREATE TABLE `craft_version`  (
  `id` bigint(20) NOT NULL,
  `line_id` bigint(20) NULL DEFAULT NULL COMMENT '产线id',
  `product_code_id` bigint(20) NULL DEFAULT NULL COMMENT '型号id',
  `version_status` int(2) NULL DEFAULT NULL COMMENT '版本状态:10草稿 20正式 30作废',
  `lock_status` int(2) NULL DEFAULT NULL COMMENT '锁定状态:1锁定 2解锁',
  `version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '版本号',
  `formal_version` int(3) NULL DEFAULT NULL COMMENT '正式版本状态  1 待生效 2 已生效  3 已失效(历史版本)',
  `start_time` datetime(0) NULL DEFAULT NULL COMMENT '生效时间',
  `end_time` datetime(0) NULL DEFAULT NULL COMMENT '失效时间',
  `reminder_mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '提醒人邮箱',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
  `create_user` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
  `update_user` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
  `create_time` timestamp(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
  `del_flag` int(2) NULL DEFAULT NULL COMMENT '逻辑删除 0未删除 1已删除',
  `tree_version` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `parent_tree_version` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '工艺版本表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片
描述

SQL语句

绝美SQL来了😍😍😍,整体SQL

SELECT
	m.*,
	v.id 
FROM
	(
SELECT
	line_id,
	product_code_id,
	max( version ) version 
FROM
	`craft_version` 
WHERE
	del_flag = 0 
	AND ( line_id, product_code_id ) IN ( SELECT line_id, product_code_id FROM craft_version WHERE id IN ( 1, 2, 3, 4, 5 ) GROUP BY line_id, product_code_id ) 
GROUP BY
	line_id,
	product_code_id 
	) m
	LEFT JOIN craft_version v ON v.line_id = m.line_id 
	AND v.product_code_id = m.product_code_id 
	AND v.version = m.version 
WHERE
	v.del_flag = 0

SQL拆解分析

绝美SQL的细节展示之in同时可以in多个字段,in的左侧两个字段,右侧必须俩字段,左右两侧能对应上,根据需要分组或者不分组

	SELECT
		line_id,
		product_code_id,
		max( version ) version 
	FROM
		`craft_version` 
	WHERE
		del_flag = 0 
		AND ( line_id, product_code_id ) IN ( SELECT line_id, product_code_id FROM craft_version WHERE id IN ( 1, 2, 3, 4, 5 ) GROUP BY line_id, product_code_id ) 
	GROUP BY
		line_id,
		product_code_id

绝美SQL的细节展示之根据多个字段分组并且获取分组内的某个字段最大值对应的信息,本SQL是根据产线line_id,型号product_code_id分组,获取每个分组里最大的版本version对应的产线,型号,版本,id等信息,如下SQL,m表是分组之后并且获取到最大版本号,然后m表再根据版本号,产线,型号关联craft_version ,获取所需要的信息
ps:同一个产线型号下的版本号不会重复

SELECT
	m.*,
	v.id 
FROM
	( SELECT line_id, product_code_id, max( version ) version FROM `craft_version` WHERE del_flag = 0 GROUP BY line_id, product_code_id ) m
	LEFT JOIN craft_version v ON v.line_id = m.line_id 
	AND v.product_code_id = m.product_code_id 
	AND v.version = m.version 
WHERE
	v.del_flag = 0
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值