在mysql中正确使用WHERE NOT
我有一个表格,里面有6169个用户。其中一些用户在名为“status”的列中标记为过期用户,其余用户的此列值为NULL。我正在尝试更新所有仍处于活动状态且值为“活动”的用户的“状态”列,但是我无法准确地选择要更新的组 当我跑的时候在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
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()的额外提示