故事的开始:
需求:
已知:client_type中,1.ios,2.android 3、ios和android
在app_version_info表中,查询产品product_id=1,并且客户端为ios的。也就是client_type=1 or client_type=3的。
下面是一个错误的栗子:
导致的结果:查询出所有client_type=1 或者 client_type=3的所有商户。
原因分析:and 比 or具有更高的优先级,所以不加括号他就从左到右开始判断。
SELECT
*
FROM
app_version_info AS a
WHERE
a.del_flag = 0
AND a.product_id = 1
AND a.client_type = 1
OR a.client_type = 3
ORDER BY
a.update_date DESC
将上面的栗子纠错,正确的栗子如下:
给and后面的or运算标标个括号。eg:and (A条件 or B条件)
SELECT
*
FROM
app_version_info AS a
WHERE
a.del_flag = 0
AND a.product_id = 1
AND (a.client_type = 1 OR a.client_type = 3)
ORDER BY
a.update_date DESC
拓展知识:
为达到需求要的效果,我们有两种方法:
1、根据mybatis-plus,我可以根据客户端传入的client_type=1查出1和3的内容,客户端传入client_type=2查出2和3的内容。像下面这样:
SELECT
*
FROM
app_version_info AS a
WHERE
a.del_flag = 0
AND a.product_id = 1
AND ( a.client_type = #{clientType} OR a.client_type = 3 )
ORDER BY
a.update_date DESC
2、通过位运算。2&2=2,3&2=2.通过client_type&2=2我们就可以得到client_type=2或3的类型。1&1=1,3&1=1.同理可得。像下面这样:
SELECT
*
FROM
app_version_info AS a
WHERE
a.del_flag = 0
AND a.product_id = 1
AND a.client_type & #{clientType}= #{clientType}
ORDER BY
a.update_date DESC
关于位运算,可以参考这篇文章:一种经典位运算的规则