故事的开始:

需求:

已知: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

Mysql的and用法和&位运算混合使用_数据库开发笔记

 将上面的栗子纠错,正确的栗子如下:

给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

Mysql的and用法和&位运算混合使用_数据库开发笔记_02

拓展知识:

为达到需求要的效果,我们有两种方法:

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

 关于位运算,可以参考这篇文章:一种经典位运算的规则

 

Mysql的and用法和&位运算混合使用_数据库开发笔记_03