我有一个包含以下信息的数据库表
+----+--------+--------+--------+
| id | status | action | reason |
+----+--------+--------+--------+
| 1 | CN | WAPP | BDEC |
| 2 | CN | DENY | PREF |
| 3 | AP | APPL | MI |
| 4 | AP | MATR | AUTO |
+----+--------+--------+--------+
已使用特定过滤器编写了从该表中选择数据的MySQL查询,以排除所有与CN-WAPP-BDEC匹配的记录。
SELECT *
FROM `table`
WHERE (`status` != 'CN' AND `action` != 'WAPP' AND `reason` != 'BDEC');
但是,它只返回记录3和4,记录#2也被排除。
如果我将查询更改为:
SELECT *
FROM `table`
WHERE CONCAT(`status`, `action`, `reason`) != 'CNWAPPBDEC';
只有这样,我才能得到预期的结果:记录2、3和4。
据我所知,查询都应该做完全相同的事情,但是显然不是,我对此感到困惑。任何见识将不胜感激。
答案 0 :(得分:2)
记录2被排除在外是因为status = CN,这使得第一个条件status != 'CN'
为假。
尝试一下:
SELECT *
FROM `table`
WHERE (NOT (`status` == 'CN' AND `action` == 'WAPP' AND `reason` == 'BDEC'));
答案 1 :(得分:1)
我认为您想要OR
,而不是AND
:
SELECT t.*
FROM `table` t
WHERE `status` <> 'CN' OR `action` <> 'WAPP' OR `reason` <> 'BDEC';
您还可以使用元组对此进行措辞:
WHERE (status, action, reason) not in ( ('CN', 'WAPP', 'BDEC') );