Mysql 查询 returns 带有 where 子句的错误数据

Mysql query returns wrong data with where clause

我正在使用以下查询从 mysql 数据库获取数据,但我得到了错误的数据。我想获取 cart_Status 为 2 或 3 且 view_Status 为 1:

的所有数据
SELECT * FROM `cart` WHERE `view_Status` = 1 AND cart_Status = 2 OR `cart_Status` = 3

这是我的数据结构和 table 的样子:

但结果,return不管 view_Status = 1 不是我的目标。

它 returns :

当然应该不会return什么的!但是,确实如此!

这是关于运算符优先级的。
您的查询评估为

SELECT * FROM `cart` WHERE (`view_Status` = 1 AND cart_Status = 2) OR `cart_Status` = 3

您应该添加括号:

SELECT * FROM `cart` WHERE `view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3)

您似乎在学习 SQL。在 WHERE 子句中使用括号,尤其是当您混合使用 ANDOR.

但是,对于您的情况,IN 是更好的解决方案:

SELECT c.*
FROM `cart` c
WHERE c.view_Status = 1 AND cart_Status IN (2, 3);

这是运算符优先级的问题。在编程语言中,通常 ANDOR 之前执行(将 AND 视为位的乘法,将 OR 视为位的加法,并且优先级变得很熟悉)。所以,你的情况:

`view_Status` = 1 AND cart_Status = 2 OR `cart_Status` = 3

解析如下:

(`view_Status` = 1 AND cart_Status = 2) OR `cart_Status` = 3

这会导致选择具有特定 cart_Status 的所有行。您必须在第二个子句周围添加括号:

`view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3)

或者,更短:

`view_Status` = 1 AND cart_Status IN (2, 3)
SELECT * FROM `cart` WHERE `view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3)

或更好

SELECT * FROM `cart` WHERE `view_Status` = 1 AND cart_Status in (2, 3);