MYSQL中UNION多张表之后对共同字段进行模糊查询失效

遇到过几次这种情况了,虽然已经解决,但是并不明白失效的原理,有大佬懂的麻烦传授一下

代码示例如下 框架是 mybatis 

 SELECT
  k1.id,
  k1.postName,
  k1.types,
 FROM (
      SELECT
         t1.id AS id,
         t1.post_name AS postName,
         t1.types AS types,
            FROM upms_post t1
            INNER JOIN upms_post_user t2 ON t2.delete_flag = 0 AND t1.id = t2.post_id
            INNER JOIN upms_teacher_account AS t3 ON t3.id = t2.user_id AND t3.delete_flag = 0
      WHERE t1.delete_flag = 0 AND t1.id != 'd9258c001c4a11eda0f80242ac110002'
      UNION ALL
      SELECT
         t1.id AS id,
         t1.post_name AS postName,
         t1.types AS types,
      FROM upms_post t1
         INNER JOIN upms_post_user t2 ON t2.delete_flag = 0 AND t1.id = t2.post_id
         INNER JOIN upms_student_account AS t3 ON t3.id = t2.user_id AND t3.delete_flag = 0
      WHERE t1.delete_flag = 0 AND t1.id != 'd9258c001c4a11eda0f80242ac110002'
      UNION ALL
      ....后略
   ) AS k1
 WHERE k1.id IS NOT NULL
<if test="info.search != null and info.search !=''">
 AND k1.postName LIKE CONCAT('%',#{info.search,jdbcType=VARCHAR},'%')
</if>
....后略
 GROUP BY k1.id

上述代码执行过程中 当info.search为汉字时模糊查询失效,并且结果为null,若info.search为数字或英文字符时则输出正常的模糊查询结果,若info.search为空时则正常查询。


解决办法:
第一种
SELECT k1.id, k1.postName, k1.types 
FROM 
( SELECT t1.id AS id, t1.post_name AS postName, t1.types AS types 
FROM upms_post t1 
INNER JOIN upms_post_user t2 ON t2.delete_flag = 0 AND t1.id = t2.post_id 
INNER JOIN upms_teacher_account AS t3 ON t3.id = t2.user_id AND t3.delete_flag = 0 WHERE t1.delete_flag = 0 AND t1.id != 'd9258c001c4a11eda0f80242ac110002' 
UNION ALL 
SELECT
t1.id AS id, t1.post_name AS postName, t1.types AS types 
FROM upms_post t1 
INNER JOIN upms_post_user t2 ON t2.delete_flag = 0 AND t1.id = t2.post_id 
INNER JOIN upms_student_account AS t3 ON t3.id = t2.user_id AND t3.delete_flag = 0 WHERE t1.delete_flag = 0 AND t1.id != 'd9258c001c4a11eda0f80242ac110002' 
UNION ALL ....后略 ) AS k1
WHERE k1.id IS NOT NULL
GROUP BY k1.id
<trim prefix="HAVING" prefixOverrides="AND ">
   <if test="info.search != null and info.search !=''">
      AND k1.postName LIKE CONCAT('%',#{info.search,jdbcType=VARCHAR},'%')
   </if>
</trim>

将where后的条件查询放到group by having 语句中 执行成功 

 第二种:

将where后的条件查询放入各个union的查询中 

例如

SELECT t1.id AS id, t1.post_name AS postName, t1.types AS types
FROM upms_post t1
INNER JOIN upms_post_user t2 ON t2.delete_flag = 0 AND t1.id = t2.post_id
INNER JOIN upms_teacher_account AS t3 ON t3.id = t2.user_id AND t3.delete_flag = 0

WHERE t1.delete_flag = 0 AND t1.id != 'd9258c001c4a11eda0f80242ac110002'

<if test="info.search != null and info.search !=''">

AND t1.postName LIKE CONCAT('%',#{info.search,jdbcType=VARCHAR},'%')

</if>


UNION ALL
SELECT
t1.id AS id, t1.post_name AS postName, t1.types AS types
FROM upms_post t1
INNER JOIN upms_post_user t2 ON t2.delete_flag = 0 AND t1.id = t2.post_id
INNER JOIN upms_student_account AS t3 ON t3.id = t2.user_id AND t3.delete_flag = 0

WHERE t1.delete_flag = 0 AND t1.id != 'd9258c001c4a11eda0f80242ac110002'

<if test="info.search != null and info.search !=''">

AND t1.postName LIKE CONCAT('%',#{info.search,jdbcType=VARCHAR},'%')

</if>

UNION ALL ....后略

实测可以解决模糊查询失效的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值