新的SQL,但我试图找到titles
其中的词"蓝色"one_answers";black"是礼物。但是,它们不能来自id为1和5的用户。我是这样做的:
SELECT title, id_card
FROM site
WHERE (title LIKE "%blue%" OR title LIKE "%black%")
AND (id_card != 1 OR id_card != 5)
ORDER BY id_card ASC;
然而,当我添加id 1和id 5不应该在查询中,它显示给我这样的东西:
博客标题 | 用户 |
---|---|
今天的蓝天真好 | 1 |
黑色是我最喜欢的颜色 | 2 |
我感觉很忧郁 | 2 |
她穿着黑色的衣服 | 3 |
你做对了。但是使用not in
来获得正确的逻辑:
SELECT title, id_card
FROM site
WHERE (title LIKE '%blue%' OR title LIKE '%black%') AND
id_card NOT IN (1, 5)
ORDER BY id ASC;
你也可以使用AND
来修复你的逻辑。
Gordon已经给了你字面上的答案,但我不确定这是否有助于你理解最初的错误,所以我要添加一些更多的信息。
你原来的构造是…
AND (id_card != 1 OR id_card != 5)
假设一行的id卡为1。我们来检查第一个条件
id_card != 1
我们的行通过这个测试了吗?不,因为身份证确实等于1。所以我们没有通过这个测试。表达式1 != 1
为false
。
等等,我们这里有一个or
条件。因此,如果满足or
条件,则整个条件可能仍然是true
。让我们检查一下……
id_card !=5
1不等于5吗?是的,1不等于5。所以我们确实通过了这个测试。表达式1 !=5
是true
因此,如果我们将表达式作为一个整体来看,我们得到:
and (false or true)
既然or
条件的一边是true
,那么整个条件为真。这就是or
的工作原理。
由于条件为真,where
子句的这一部分不会将其过滤掉。所以我们得到了id_card
= 1的行
请注意,无论id_card
的值是什么,条件(id_card != 1 or id_card != 5)
都将为真,因为对于您选择的任何值,该值都不能同时为1和5。要么不是1,要么不是5。因此,or
条件至少有一面总是为真。