1

クエリで奇妙な問題が発生しています。2つの日付を使用して検索を行っています。データベース内のすべての日付が2012-12-0200:00:00mysql形式でフォーマットされていますが、ANDを無視しているだけです。 cslblicstat = '10' AND wcxdate BETWEEN'$ date1' AND'$ date2'そして、一致するクラスを持つものをすべて与えてくれます。

$user = $session->username;
if(isset($_POST['carrier'])){
$carrier = $_POST['carrier'];
$class[] = $_POST['class'][0];
$date1 = $_POST['date1'];
$date1 = date("Y-m-d 00:01", strtotime($date1));
$date2 = $_POST['date2'];
$date2 = date("Y-m-d 59:59", strtotime($date2));

 foreach( $class as $key){
 $query =   "SELECT * FROM leads WHERE class1 = '$key' OR class2 = '$key' OR class3 = '$key' OR class4 = '$key' OR class5 = '$key' OR class6 = '$key' OR class7 = '$key' OR class8 = '$key' OR class9 = '$key' OR class10 = '$key' OR class11 = '$key' OR class12 = '$key' AND user = '' AND wccompcode = '$carrier' AND cslblicstat = '10' AND wcxdate BETWEEN '$date1' AND '$date2' LIMIT 100";
$sellead = mysql_query($query)or die(mysql_error());
while($leads = mysql_fetch_array($sellead)){

    $arrayl[] = $leads;
    $rowid = $leads['ID'];
    $update = mysql_query("UPDATE leads SET user = '$user' WHERE ID = '$rowid'")or die(mysql_error());

}
}
}
4

2 に答える 2

3

SQLでは、AND演算子の優先順位は。よりも高くなりORます。ORed条件を括弧で囲む必要があると思います。

SELECT * 
FROM leads
WHERE (class1 = '$key' OR class2 = '$key' OR ... OR class12 = '$key')
  AND user = '' 
  AND wccompcode = '$carrier' 
  AND cslblicstat = '10' 
  AND wcxdate BETWEEN '$date1' 
                  AND '$date2' 
LIMIT 100   

演算子の優先順位がわからない場合は、括弧を使用してください(またはマニュアルを参照してください)。

その条件を次のように書くこともできますIN

WHERE '$key' IN (class1, class2, ... , class12)
  AND user = ''
  ---
于 2012-12-03T01:13:36.787 に答える
1

MySQLでは、ANDはORの前に評価されます。したがって、WHERE句はこれと同等です。

SELECT 1 OR 0 AND 0;

結果は真です:

+--------------+
| 1 OR 0 AND 0 |
+--------------+
|            1 |
+--------------+

また、構文的に単純なOR条件の表現方法は、次のようになります。

WHERE '$key' IN ( class, class2, class3, ... ) AND ... ;

しかし、そのような数値の列がある場合はいつでも、それが実際に意味するのは、スキーマを改善できるということです。

于 2012-12-03T01:14:36.520 に答える