6

好的,我必须在这里遗漏一些非常简单的东西。我只想从 user_id 匹配的表中返回所有记录(简单!)并且“付费”字段为 NULL 或 0。我的“付费”字段是 TinyInt (1)。

我的 CakePHP 模型代码是:

$workingRecord = $this->find('first',array(
    'conditions'=>array(
        'Subscription.user_id'=>$userId,
        array('not' => array('Subscription.paid' => true)) // Not True, to catch both false or NULL values
    )
));

CakePHP 生成的 SQL 是这样的:

SELECT `Subscription`.`id`, `Subscription`.`paid` FROM `subscriptions` AS `Subscription` WHERE `Subscription`.`user_id` = 3 AND NOT (`Subscription`.`paid` = '1') LIMIT 1

常识会说这应该有效。问题是 SQL 将在“付费”列中返回包含 0 的行,但永远不会返回 NULL。

有没有办法在不使用“或”的情况下一次性返回零和空值?

提前致谢。

4

2 回答 2

5

当您使用布尔字段离开联接表时,即使联接表的架构不允许,结果集也可能包含 NULL 值。

因此,作为一般情况,我建议:

where `Subscription`.`paid` = 0 or `Subscription`.`paid` IS NULL
于 2015-07-08T12:45:33.743 回答
2

如果您的字段是 TINYINT(1),则不应有任何 NULL 值。 如果这样做,请运行快速查询以将任何 NULL 替换为默认值,并将数据库字段设置为默认值 1 或 0。

然后,您的代码应该是:

$workingRecord = $this->find('first',array(
    'conditions'=>array(
        'Subscription.user_id'=>$userId,
        'Subscription.paid' => 0
    )
));

它没有像你想象的那样工作的原因:

根据MySQL 关于 'NOT' 的文档

逻辑非。如果操作数为 0,则计算为 1,如果操作数为非零,则计算为 0,并且 NOT NULL 返回 NULL。

所以 - 在你的情况下,你说"NOT 1"的是 MySQL 翻译成" = 0".

于 2012-11-12T07:24:45.790 回答