0

奇妙な振る舞いをしているクエリがあります...

まず、ユーザー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のメッセージがあることがわかっているので、行を返す必要がありますが、何らかの理由で、上記のクエリは行を返しています...toid1read0binned00

どうしてこれなの?


アップデート

SequelProで見た私のテーブル構造のスクリーンショットは次のとおりです。

スクリーンショット

SequelProで見たテーブル内のデータのスクリーンショットは次のとおりです。

スクリーンショット2

ご覧のとおり、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;
}

これまでのところ助けてくれてありがとう、しかし私はまだこれがうまくいかない理由を理解することができません。readMySQLがキーワードとして使用しないように、クエリでバックティックを追加してを使用しています。

私はそれが私が行方不明になっている本当に明白な何かに賭けます...

4

4 に答える 4

1

ジェームズ、問題はテーブルがどのように設定されたかに関係しているのではないかと思います。

「読み取り」列と「ビン化」列のデータ型はENUMであるため、このテーブルに行を挿入するときは、正しいデフォルト値(「0」または「1」)を設定するか、常に有効な値を指定する必要があります。つまり、「pms」行を挿入するときに、「読み取り」列または「ビン化」列のいずれかの値を省略することはできません。

つまり、「pms」テーブルがデフォルトなしで次のように設定されている場合:

create table pms (
  toid int,
  `read` ENUM('0','1') ,
  binned ENUM('0','1') 
  );

次に、次のように完全に指定された行値を挿入する必要があります。

insert into pms (toid, `read`, binned) values
  (1, '0', '0'),
  (1, '0', '1'),
  (1, '1', '0'),
  (1, '1', '1')
;

次のようなスパースデータの挿入は避けてください。

insert into pms (toid) values (1);
insert into pms (toid, binned) values (1, '1');
insert into pms (toid, `read`) values (1, '1');
insert into pms (toid, `read`, binned) values (1, '1', '1');

これらの列に正しいデフォルトの列挙値を指定すると、この問題も解決されます。

create table pms (
  toid int,
  `read` ENUM('0','1') default '0',
  binned ENUM('0','1') default '0' 
  );

説明のためにsqlfiddleを設定しました。

于 2013-01-27T17:32:19.723 に答える
0

うわーハハ私はちょうどそれが行を返さない理由を見つけました。

SQLクエリのPHP実装で、バッククォートの代わりに誤って一重引用符を使用していました...

だから私のクエリは実際には:

$sql = "SELECT * FROM `pms` WHERE `toid` = '".$this->getUserID()."' AND `read` = '0' AND 'binned' = '0'";

あるべきだったとき:

$sql = "SELECT * FROM `pms` WHERE `toid` = '".$this->getUserID()."' AND `read` = '0' AND `binned` = '0'";`

ご覧のとおり、クエリの終わり近くで、binned誤って一重引用符を使用していました。

こんなに簡単だったと思いますか?

興味深いことに、MySQLにブール値を格納する必要があると思いますか?

于 2013-01-27T21:53:59.760 に答える
0

列が整数の場合は、これを試してください

   SELECT * FROM `pms` WHERE `toid` = 1 AND `read` = 0 AND `binned` = 0

編集:このデモのような整数であるのはあなたの列でなければなりません。

SQLFIDDLEデモ

または、ここのように文字列として値を列挙する

 SELECT * FROM `pms` 
WHERE `toid` = 1 AND `read` = '0' AND `binned` = '0'

sqllfiddleデモ

于 2013-01-27T17:21:55.520 に答える
0

変数を正しく設定したかどうかをテストしてみてください。1つの変数だけをクエリしたときに正しい結果が得られるかどうかをテストすることをお勧めします。:

SELECT * FROM `pms` WHERE `toid` = '1'; -- 3;

SELECT * FROM `pms` WHERE `read` = '0'; -- 4;

SELECT * FROM `pms` WHERE `binned` = '0'; -- 4;

古典的な間違いは、文字列(ENUM)値の代わりに整数値を使用したか、nullの代わりにゼロを使用したことです。

SQL FIDDLE DEMO

于 2013-01-27T18:20:56.123 に答える