gpt4 book ai didi

MySQL 假设我不想要基于所使用的运算符的任何结果

转载 作者:行者123 更新时间:2023-11-30 01:02:38 24 4
gpt4 key购买 nike

我有一个消息传递表,其中包含运行一些运算符的列。有几个 threadid,我通过检查一个值是否与 uidto 或 uidfrom 匹配来提取消息,然后检查一个值是否在hidden1或hidden2中(或者基本上一个用户删除了该线程,但我们希望保持它对其他用户仍然可见) ...)

编辑:
值得注意的是,hidden1 和hidden2 列的值是选择对自己隐藏线程的用户ID。

当用户有多个线程,并且我将一个线程设置为已删除(hidden1 值 = 1)时,查询将不会拉取任何其他线程,尽管它们的hidden1 和hidden2 列仍为NULL。

我这里有一个 SQL Fiddle,其中包含表中的数据和我一直在使用的查询:http://sqlfiddle.com/#!2/e3c39c/3

显示具有多个threadid的所有结果
请注意,只有 threadid 1 具有带有值的隐藏列

SELECT uidto, uidfrom, threadid, hidden1, hidden2 FROM messages;

尝试获取结果
mysql 看到我的一个线程的hidden1 列有值,但没有显示任何内容,即使其他线程hidden1 和hidden2 列仍然为NULL?

SELECT * FROM messages
WHERE (uidto=1 OR uidfrom=1)
AND (hidden1 <> 1 OR hidden2 <> 1)
GROUP BY threadid
ORDER BY last_activity DESC

最佳答案

Any sort of arithmetic comparison against NULL always returns NULL并被视为虚假;在这种情况下,这意味着 hidden1 <> 1 ,其中hidden1为NULL,返回一个有效的假值,尽管事实上NULL明显不等于1,或者实际上不等于包括其本身在内的任何其他值。 (试试吧!SELECT NULL = NULL,你会得到 NULL。)

要解决该问题,请将不等式比较替换为 IS NULL ,或者(最好)使用整数零而不是 NULL 来表示您的错误值,以便您可以使用算术比较来进行真实性测试。

在不更改数据的情况下,您可以通过将比较替换为 NULL 感知的比较来使查询正常工作,因此:

SELECT * FROM messages
WHERE (uidto=1 OR uidfrom=1)
AND (hidden1 IS NULL OR hidden2 IS NULL)
GROUP BY threadid
ORDER BY last_activity DESC

其结果是

ID  UIDTO   UIDFROM     THREADID    MESSAGE     STATUS  DATETIME                            LAST_ACTIVITY                       LAST_MESSAGE            HIDDEN2     HIDDEN1     TYPE
1 10002 1 1 hey 0 November, 14 2013 00:28:58+0000 November, 14 2013 00:36:13+0000 hans here. (null) 1 message
3 15047 1 3 CJ TO BG 0 November, 14 2013 00:34:53+0000 November, 14 2013 00:34:53+0000 CJ TO BG (null) (null) message

(另请参阅 the updated fiddle 。)

关于MySQL 假设我不想要基于所使用的运算符的任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19968132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com