0

次のクエリ

SELECT * FROM workshops 
WHERE workshop_zipcode LIKE '75___' 
  OR workshop_zipcode LIKE '77___' 
  AND workshop_category = 14 
  AND active = 1 
  AND workshop_date >= NOW() 
ORDER BY workshop_date ASC

エラーを生成せず、実際に機能しますが、少し問題があります:この部分

AND workshop_date >= NOW()

何もフィルタリングせず、比較記号を等しいものに置き換えることを繰り返し、同じリストが取得されます。

最初の2つのANDはうまく機能しますが、3番目は機能しません。

4

3 に答える 3

5

あなたはこのようにあなたのOR状態を括弧でくくる必要があります:

SELECT * FROM workshops 
WHERE (workshop_zipcode LIKE '75___' 
OR workshop_zipcode LIKE '77___')
AND workshop_category = 14 
AND active = 1 
AND workshop_date >= NOW() 
ORDER BY workshop_date ASC

括弧なしでは、本質的にこれを呼び出しています:

SELECT * FROM workshops 
WHERE workshop_zipcode LIKE '75___' 
OR (workshop_zipcode LIKE '77___'
AND workshop_category = 14 
AND active = 1 
AND workshop_date >= NOW())
ORDER BY workshop_date ASC

これは、ANDの前に計算されるためですOR。このリファレンスを参照してください

http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

于 2012-09-05T17:31:58.100 に答える
1

これは、演算子の優先順位に関する問題である可能性があります。

SQLは、最初にすべてのANDステートメントを評価し、次にORステートメントを評価します。それらを角かっこで囲むと、期待どおりの結果が得られる可能性があります。

SELECT * FROM workshops 
WHERE (workshop_zipcode LIKE '75___' 
OR workshop_zipcode LIKE '77___')
AND workshop_category = 14 
AND active = 1 
AND workshop_date >= NOW() 
ORDER BY workshop_date ASC

これにより、ワークショップの郵便番号がチェックされ、次に残りの基準がチェックされます。

于 2012-09-05T17:32:14.317 に答える
0

これで試してください:

SELECT * FROM workshops 
WHERE ( workshop_zipcode LIKE '75___' 
OR workshop_zipcode LIKE '77___' )
AND workshop_category = 14 
AND active = 1 
AND workshop_date >= NOW() 
ORDER BY workshop_date ASC
于 2012-09-05T17:31:44.080 に答える