java/mysql多个字段in从而保持字段一一对应

1、出现问题:

java内用Example拼接条件时,导致查询出来的数据不一致。

当时的查询条件时这样,导致查询数据增多,从而不对,不是一一对应。

if (pageParam.getIsUseSettle() != null) {
            criteria.andCondition(" commodity_id in (select commodity_id from a where is_delete = 0 and biz_status = 1 and is_use_settle = " + pageParam.getIsUseSettle() + ") ");
            criteria.andCondition(" supplier_id in (select supplier_id from a where is_delete = 0 and biz_status = 1 and is_use_settle = " + pageParam.getIsUseSettle() + ") ");
        }

2、解决问题

mysql支持一一对应的sql查询:

修改后如下:

  if (pageParam.getIsUseSettle() != null) {
            criteria.andCondition("(commodity_id,supplier_id) IN ( SELECT commodity_id,supplier_id FROM a WHERE is_delete = 0 AND biz_status = 1 AND is_use_settle =  " + pageParam.getIsUseSettle() + ") ");
        }

这样就是一一对应,查询出数据就是正确的。

后端打印出sql如下:

SELECT
  *
FROM
  b
WHERE
  (
    (
      account_status = 2 

      AND (commodity_id,supplier_id) IN ( SELECT commodity_id,supplier_id FROM a WHERE is_delete = 0 AND biz_status = 1 AND is_use_settle = 0 ) 
      
    ) 
    AND ( is_delete = 0 ) 
  ) 
ORDER BY
  audit_time DESC 
  LIMIT 20;

3、总结

多个字段同时使用

select * from user where (user_id,status) in ((1,2),(2,2),(3,2));

多表同时多个字段使用

select * from user where (legal_id,status) not in (select a.legal_id,a.type from user as a , role_user_relation as b  where a.legal_id=b.legal_id and a.type=b.legal_type) limit 0,10;

但是不建议这样用,不走索引,能直接关联的sql,就用连接join,除非在java代码拼接sql才这样用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

damoneric_guo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值