6

OK私はここで本当に単純な何かを見逃しているに違いありません。user_idが一致し(簡単!)、「paid」フィールドがNULLまたは0であるテーブルからすべてのレコードを返したいだけです。「paid」フィールドは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を返さないことです。

'または'を使用せずに、1つのストロークでゼロと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
    )
));

あなたが思うように機能しない理由:

「NOT」に関するMySQLのドキュメントによると:

論理否定。オペランドが 0 の場合は 1 に評価され、オペランドがゼロ以外の場合は 0 に評価され、NOT NULL は NULL を返します。

つまり、あなたの場合、"NOT 1"MySQL が に変換すると言っているのです" = 0"

于 2012-11-12T07:24:45.790 に答える