背景:
今天产品验收的时候,导入了大量数据;发现造价项目某个查询列表数据多出了几条数据;看了Mybatis查询,才发现是同时使用了多个IN查询导致的问题;入参是对象列表,In值是分开循环赋值的,问题就出在这里。
需要根据两个字段去查询多个值,这两个字段值不同的数据,以前一直以为In查询只能查询一个字段的多个值。今天百度发现了一种写法,可以同时In查询多个字段的不同值。
解决办法:
SELECT * FROM more_in WHERE (lmm_id, item_id, `name`) IN ((1,2, '工料机1'),(2,2, '工料机2'),(3,3, ''));
脚本实例:
-- ---------------------------- -- Table structure for more_in -- ---------------------------- DROP TABLE IF EXISTS `more_in`; CREATE TABLE `more_in` ( `id` int NOT NULL AUTO_INCREMENT, `lmm_id` int NULL DEFAULT NULL, `item_id` int NULL DEFAULT NULL, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of more_in -- ---------------------------- INSERT INTO `more_in` VALUES (1, 1, 2, '工料机1', NULL); INSERT INTO `more_in` VALUES (2, 2, 2, '工料机2', NULL); INSERT INTO `more_in` VALUES (3, 3, 3, '工料机3', NULL); INSERT INTO `more_in` VALUES (4, 4, 3, '工料机4', NULL); INSERT INTO `more_in` VALUES (5, 5, 1, '工料机5', NULL); INSERT INTO `more_in` VALUES (6, 2, 3, '工料机6', NULL);
查询需要的入参列表数据,如下:
-- lmm_id, item_id
-- 1,2
-- 2,2
-- 3,3
错误写法:
通过如下语句查询,会多出ID为6的数据:
SELECT * FROM more_in aWHERE a.lmm_id IN (1,2,3) AND a.item_id IN (2,2,3);
正确写法:
IN同时可以In多个字段,In的左侧两个字段,右侧必须俩字段,左右两侧能对应上:
SELECT * FROM more_in WHERE (lmm_id, item_id) IN ((1,2),(2,2),(3,3));
MyBatis XML 写法:
//mapper接口定义 List
其他:
/** * 获取相同item_code相关相同工机下含量不一致的item_code列表 * @return **/ ListgetDiscrepancyList(@Param("data") TbProjectDTO dto);
如果本篇文章对你有帮助的话,很高兴能够帮助上你。
当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章