奇妙な振る舞いをしているクエリがあります...
まず、ユーザーID 1のPMが読み取られたか削除されたかに関係なく、すべてのPMを取得するためのクエリを次に示します。
SELECT * FROM `pms` WHERE `toid` = '1'
3
これにより、期待どおりに行が返されます。次に、このユーザーの未読メッセージのみを取得できるかどうかを確認しましょう。
SELECT * FROM `pms` WHERE `toid` = '1' AND `read` = '0'
2
これにより、期待どおりに行が返されます。ビニングされた既読メッセージと未読メッセージを取得できるかどうかを見てみましょう。
SELECT * FROM `pms` WHERE `toid` = '1' AND `binned` = '0'
2
これにより、期待どおりに行が返されます。
実行する必要のあるクエリは、指定されたユーザーIDの未読メッセージとビニングされていないメッセージをすべて取得しています。これを行うために、私はこれを行っています:
SELECT * FROM `pms` WHERE `toid` = '1' AND `read` = '0' AND `binned` = '0'
ただし、データベースにas 、as 、as1
のメッセージがあることがわかっているので、行を返す必要がありますが、何らかの理由で、上記のクエリは行を返しています...toid
1
read
0
binned
0
0
どうしてこれなの?
アップデート
SequelProで見た私のテーブル構造のスクリーンショットは次のとおりです。
SequelProで見たテーブル内のデータのスクリーンショットは次のとおりです。
ご覧のとおり、toidが1で、0として読み取られ、0としてビニングされたレコードが確実に1つあります。
更新2
これらがENUMである理由は、ブール値をMySQLに格納したいためです。これを行うには、列を「1」または「0」のいずれかに強制し、デフォルトで「0」にします。誰かがMySQLにブール値を格納するより良い方法を持っているなら、私は学びたいです。
User.class.php
次に、このSQLを使用して未読数を取得しているファイル内のPHP関数を次に示します。この関数は、を返す0
必要があるときに戻り1
ます。私が使用している現在のユーザーであるため、が返されます$this->getUserId()
。1
public function getUnreadCount()
{
global $database;
$sql = "SELECT * FROM `pms` WHERE `toid` = '".$this->getUserID()."' AND `read` = '0' AND 'binned' = '0'";
$query = $database->query($sql);
$count = $database->count($query);
return $count;
}
これまでのところ助けてくれてありがとう、しかし私はまだこれがうまくいかない理由を理解することができません。read
MySQLがキーワードとして使用しないように、クエリでバックティックを追加してを使用しています。
私はそれが私が行方不明になっている本当に明白な何かに賭けます...