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;

MySQL同时in俩个字段;根据多个字段分组并且获取分组内的某个字段最大值所对应的信息_第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

你可能感兴趣的:(MySQL,mysql,java,数据库)