MySQL同时In俩个字段,In多个字段,Mybatis多个In查询问题,Mysql多个IN查询多出数据问题,Mysql多个IN查询 数据准确问题

背景:        

        今天产品验收的时候,导入了大量数据;发现造价项目某个查询列表数据多出了几条数据;看了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 a
WHERE 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<Map<String, Object>> getResult(@Param("list") List<Map<String, String>> list);
<select id="getResult" resultType="java.util.HashMap">
	select * from demo t where (t.id, t.name) in
	<foreach collection="list" item="item" open="(" close=")" separator=",">
		(#{item.id},#{item.name})
	</foreach>
</select>

其他:

/**
  * 获取相同item_code相关相同工机下含量不一致的item_code列表
  * @return
  **/
List<TbProjectItemDTO> getDiscrepancyList(@Param("data") TbProjectDTO dto);

<select id="getDiscrepancyList" resultType="org.dto.TbProjectItemDTO">
        SELECT
            tl.lmm_id, cq.item_code
        FROM `tb_project_lmm` AS tl
            LEFT JOIN `tb_project` AS cq ON cq.project_id= tl.project_id
                AND cq.state_deleted = 0
        WHERE
            tl.state_deleted = 0
        <if test="data.projectId != '' and data.projectId != null">
            AND tl.`project_id` = #{data.projectId}
        </if>
        GROUP BY cq.`item_code`, tl.lmm_id HAVING COUNT(DISTINCT IF(tl.`quantity` IS NULL,0,tl.`quantity`)) &gt; 1
</select>

如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。

  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值