Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中正确使用WHERE NOT_Mysql_Sql - Fatal编程技术网

在mysql中正确使用WHERE NOT

在mysql中正确使用WHERE NOT,mysql,sql,Mysql,Sql,我有一个表格,里面有6169个用户。其中一些用户在名为“status”的列中标记为过期用户,其余用户的此列值为NULL。我正在尝试更新所有仍处于活动状态且值为“活动”的用户的“状态”列,但是我无法准确地选择要更新的组 当我跑的时候 SELECT COUNT(id) FROM users; SELECT COUNT(id) FROM users WHERE status='expired' 它确认了6169个用户计数 当我跑的时候 SELECT COUNT(id) FROM users; S

我有一个表格,里面有6169个用户。其中一些用户在名为“status”的列中标记为过期用户,其余用户的此列值为NULL。我正在尝试更新所有仍处于活动状态且值为“活动”的用户的“状态”列,但是我无法准确地选择要更新的组

当我跑的时候

SELECT COUNT(id) FROM users;
SELECT COUNT(id) FROM users WHERE status='expired'
它确认了6169个用户计数

当我跑的时候

SELECT COUNT(id) FROM users;
SELECT COUNT(id) FROM users WHERE status='expired'
它确认了2500名过期用户。然而,当我跑的时候

SELECT COUNT(id) FROM users WHERE status !='expired'
我数到0。我也尝试过类似的变化

SELECT COUNT(id) FROM users WHERE NOT status='expired'

看了很多其他的StackOverflow问题,但不明白为什么我的语法不正确。任何帮助都将不胜感激

Status可能是一个可为NULL的列,并且
NULL!='过期的“
永远不会为真

你可以试试这个:

SELECT COUNT(id) FROM users WHERE status IS NULL

它应该返回3696。请参阅fiddle。

状态可能是一个可为空的列,并且
NULL!='过期的“
永远不会为真

你可以试试这个:

SELECT COUNT(id) FROM users WHERE status IS NULL

它应该返回3696。请参阅fiddle。

选择所有过期用户

SELECT COUNT(id) FROM users WHERE status = 'expired'
选择所有活动用户

SELECT COUNT(id) FROM users WHERE status IS NULL;

选择所有过期用户

SELECT COUNT(id) FROM users WHERE status = 'expired'
选择所有活动用户

SELECT COUNT(id) FROM users WHERE status IS NULL;

你可以像那样反过来做

SELECT COUNT(id) FROM users 
WHERE id not in (SELECT id FROM users WHERE status='expired')

你可以像那样反过来做

SELECT COUNT(id) FROM users 
WHERE id not in (SELECT id FROM users WHERE status='expired')
可能试试

SELECT COUNT(id) FROM users WHERE status NOT IN ('expired')

从状态为“过期”的用户中选择计数(id)
相反?通常我会在列是数字值时执行这些操作,我不确定它是否适用于字符串值。

可能尝试一下

SELECT COUNT(id) FROM users WHERE status NOT IN ('expired')

从状态为“过期”的用户中选择计数(id)

相反?通常我会在列为数值时执行这些操作,我不确定它是否适用于字符串值。

正如您在问题中提到的,
状态
列采用
空值。对
null
值进行任何比较(除了
为null
)都会返回
null
。并且,
NULL
被认为是错误的。您可以将其视为“未知”而不是“缺失”,因为这有助于逻辑

正如您所发现的那样,
NULL
值会使所有这些失败:

where status = 'expired'
where status <> 'expired'
where not status = 'expired'
where not status <> 'expired'
where status = NULL
where status != NULL
要获取活动,您需要:

SELECT COUNT(id)
FROM users
WHERE status <> 'expired' or status is NULL

后者更容易阅读。如果索引可用,以前的版本更有可能使用索引。

正如您在问题中提到的,
状态
列具有
空值。对
null
值进行任何比较(除了
为null
)都会返回
null
。并且,
NULL
被认为是错误的。您可以将其视为“未知”而不是“缺失”,因为这有助于逻辑

正如您所发现的那样,
NULL
值会使所有这些失败:

where status = 'expired'
where status <> 'expired'
where not status = 'expired'
where not status <> 'expired'
where status = NULL
where status != NULL
要获取活动,您需要:

SELECT COUNT(id)
FROM users
WHERE status <> 'expired' or status is NULL

后者更容易阅读。如果索引可用,早期版本使用索引的可能性更大。

您确定您有状态为未过期的id吗?应该足以检查
状态
是否不同于
“过期”
状态
是否为空:
。。。其中(状态!='已过期或状态为空)
。尝试使用
而不是
=。您确定您有状态为未过期的id吗?应该足以检查
状态
是否与
“过期”
不同,或者
状态
是否为空:
。。。其中(状态!='已过期或状态为空)
。尝试使用
而不是
=。根据OP的说法,我认为您不希望过期用户的状态值为空。根据OP的说法,我认为您不希望过期用户的状态值为空。感谢您的全面响应,fthiella也指出了同样的问题,只是碰巧先看到了这一点。感谢您提供的有关coalesce的额外提示()感谢您的全面回复,fthiella也指出了同样的问题,只是碰巧第一次看到了这一点。感谢您提供有关coalesce()的额外提示