我使用以下方法在Wordpress中过滤我的数据库:
$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(rid) FROM $table_name WHERE rid = ( SELECT id FROM $table_name WHERE pid = '%s' AND activated != 0 )", $pid ) );
目前$count
为4
,而3
应为activated = 0
,因为我的数据库中的最后一个条目为'0'
,如此屏幕截图所示:
黄色=目标行,而最后一行应作为%s
进行过滤,不计算在内。
pid
是?pid=123…
(个人ID)的变量,由字符串{{1}}接收。这确实有效,并不是问题,因为属于示例pid(绿色)的所有黄色行都会被计算。
我的错误在哪里?
答案 0 :(得分:1)
NULL
与空字符串或0
整数之间存在很大差异。 IS NOT
运算符用于NULL
比较,因为NULL=NULL
为false。
你应该这样做:
activated=0
或者这个:
activated IS NOT NULL
如果您在该列中允许NULL
,则可能需要针对0
和NULL
状态进行测试,或者将其翻转到此处:
activated!=1
答案 1 :(得分:1)
如果激活是数字,则应使用
SELECT id FROM $table_name WHERE pid = '%s' AND activated <> 0
或if是一个字符串
SELECT id FROM $table_name WHERE pid = '%s' AND activated <> '0'
答案 2 :(得分:1)
如果在SQL中比较[value] = NULL,则结果为NULL。
因此,当您想要过滤所有未激活的行时,&#39; 0&#39;那么你应该这样做:
SELECT id FROM $table_name WHERE pid = '%s' AND activated IS NOT '0' OR activated IS NULL
其他解决办法可以是:
SELECT id FROM $table_name WHERE pid = '%s' AND COALESCE(activated,'NULL') <> '0'
答案 3 :(得分:1)
SELECT COUNT(rid) FROM $table_name WHERE rid = ( SELECT id FROM $table_name WHERE pid = '%s' AND activated != 0 )", $pid ) AND activated != 0
将此 AND激活!= 0 添加到rid()
的结尾