1

解決済み:国とOSのテーブルのデータ型がVARCHARに設定されていたため、ここで=0を='0'に変更しました。これを指摘してくれたraina77owに感謝します!感謝します。

このクエリの書き方がよくわかりません。基本的に、2つの列(OSとcountry_code)を持つテーブルを作成します。さらに多くの列がありますが、これらは条件付きのものです。これらは、すべての場合は0に設定されるか、特定の場合はコンマで区切られて設定されます。

今、私が達成しようとしているのは、OSとcountry_code = 0の場合、または一致するデータ(コンマで区切られている)が含まれている場合に、テーブルからデータをプルすることです。

次に、時間の列があります。列time_tがfalseに設定されていない限り、時間が時間列よりも大きい行を選択したいと思います。この場合、これは問題ではありません。

私はそれを正しく説明したと思いますか?

これは私がこれまでに持っているものです:

$get = $db->prepare("SELECT * FROM commands 
    WHERE country_code = 0 OR country_code LIKE :country_code 
    AND OS = 0 OR OS LIKE :OS 
    AND IF (time_t = 1, expiry > NOW())
");
$get->execute(array(
    ':country_code' => "%{$data['country_code']}%",
    ':OS' =>  "%{$data['OS']}%"
));

編集:これは私が現在使用しているコードですが、それでもOSとCountry_codeの部分を機能させることができないようです:

$get = $db->prepare("SELECT * FROM commands 
WHERE (country_code = 0 OR country_code LIKE :country_code) 
AND (OS = 0 OR OS LIKE :OS) 
AND (time_t <> 1 OR expiry > NOW())
");

$get->execute(array(
':country_code' => "%{$data['country_code']}%",
':OS' =>  "%{$data['OS']}%"
));

DBに送信されるデータは次のようになります。OS=>Windows7 country_code => GB 1つだけが送信され、1つだけが送信されます。私が今抱えている問題は、それがOSで、そして当面は機能しているということですが、国では機能していません。テーブルのデータが「FR、SA」で、LIKE'%GB%'を実行した場合でも、生のクエリを試しましたが、それでも行が返されました。

4

1 に答える 1

1

これは論理演算子の優先順位の問題です。ラダーANDよりも高いORため、元のクエリは次のように実行されます...

WHERE country_code = 0 OR (country_code LIKE ... AND OS = 0) OR OS LIKE...

次のように、括弧を使用して条件を区切ります。

WHERE (country_code = 0 OR country_code LIKE ...) 
  AND ( OS = 0 OR OS LIKE ...)

そして、このクエリの最後のフィルタ条件は、次のように記述する必要があります...

AND ( time_t <> 1 OR expiry > NOW() )

更新:...そしてそれは実際にはcountry_code = '0'あなたのコードではこのようなものでなければなりません。VARCHAR列をチェックしていることを覚えておいてください。

于 2012-07-07T15:10:04.070 に答える