-1

上記の質問に加えて、このMySQLステートメントを最適化する方法があるかどうかを知りたいです。

SELECT *
FROM `products`
WHERE
  `category` = 3073 OR
  `category` = 3074 OR
  `category` = 3100 OR
  `category` = 3102 OR
  `category` = 3106 OR
  `category` = 3109 OR
  `category` = 3111 OR
  `category` = 3115 OR
  `category` = 3130 OR
  `category` = 3134 OR
  `category` = 3144 OR
  `category` = 3146 OR
  `category` = 3152 OR
  `category` = 3157 OR
  `category` = 3162 OR
  `category` = 3163 OR
  `category` = 3164 OR
  `category` = 3166 OR
  `category` = 3167 OR
  `category` = 3168 OR
  `category` = 3170 OR
  `category` = 3171 OR
  `category` = 3177 OR
  `category` = 3181 OR
  `category` = 3182 OR
  `category` = 3184 OR
  `category` = 3190 OR
  `category` = 3191 OR
  `category` = 3192 OR
  `category` = 3213 OR
  `category` = 3224 OR
  `category` = 3227 OR
  `category` = 3228 OR
  `category` = 3235 OR
  `category` = 3238 OR
  `category` = 3239 OR
  `category` = 3240 OR
  `category` = 3244 OR
  `category` = 3245 OR
  `category` = 3246 AND
  `active` = 1 AND
  `price_notax` > 0 AND
  `deleted` = 0
ORDER BY `position` ASC
LIMIT 0, 24;

price_notaxこのステートメントは、フィールド値がに等しい製品も表示しています0。なぜですか?数はより多くする必要があると述べました0...

どんな助けでもいただければ幸いです。

4

5 に答える 5

5
SELECT *
FROM products
WHERE category in (3073, 3074) -- and so on
AND `active` = 1
AND `price_notax` > 0 
AND `deleted` = 0 
ORDER BY `position` -- ASC is by default
LIMIT 0, 24

OR AND を使用しているため、クエリは間違った結果を表示します。そのため、条件の 1 つだけが true の場合 (たとえば、category=3100)、それが表示されます。

于 2012-10-05T18:55:48.143 に答える
3

これは、「and」が「or」よりも優先され、ステートメントでは最後の部分のみが「anded」されてcategory= 3246 になるためです。or 部分の周りに括弧 () を配置する必要があります。

于 2012-10-05T18:55:12.670 に答える
1

そのWHERE句が評価されるとき、ORed句のいずれかがtrueであると、AND句の状態は無関係になります。これを修正するには、OR句のセットを括弧で囲んで、個別に評価されるようにする必要があります。

ただし、同じことを読みやすくするには、代わりにIN句を使用します。

SELECT * 
FROM products 
WHERE category IN (3073, 3074, 3100, 3102, 3106, 3109, 3111, 3115, 3130, 3134, 3144, 3146, 3152, 3157, 3162, 3163, 3164, 3166, 3167, 3168, 3170, 3171, 3177, 3181, 3182, 3184, 3190, 3191, 3192, 3213, 3224, 3227, 3228, 3235, 3238, 3239, 3240, 3244, 3245, 3246) 
AND active = 1 
AND price_notax > 0 
AND deleted = 0 
ORDER BY position ASC LIMIT 0, 24;
于 2012-10-05T18:57:00.043 に答える
1

これらのカテゴリIDの配列を作成してから使用しないでください

    WHERE category IN somearray
于 2012-10-05T18:56:20.463 に答える
0

ORより優先度が低いAND

より正しい SQL:

SELECT * 
FROM `products` 
WHERE ( 
    `category` = 3073 OR `category` = 3074 OR `category` = 3100 OR 
    `category` = 3102 OR `category` = 3106 OR `category` = 3109 OR 
    `category` = 3111 OR `category` = 3115 OR `category` = 3130 OR 
    `category` = 3134 OR `category` = 3144 OR `category` = 3146 OR 
    `category` = 3152 OR `category` = 3157 OR `category` = 3162 OR 
    `category` = 3163 OR `category` = 3164 OR `category` = 3166 OR 
    `category` = 3167 OR `category` = 3168 OR `category` = 3170 OR 
    `category` = 3171 OR `category` = 3177 OR `category` = 3181 OR 
    `category` = 3182 OR `category` = 3184 OR `category` = 3190 OR 
    `category` = 3191 OR `category` = 3192 OR `category` = 3213 OR 
    `category` = 3224 OR `category` = 3227 OR `category` = 3228 OR 
    `category` = 3235 OR `category` = 3238 OR `category` = 3239 OR 
    `category` = 3240 OR `category` = 3244 OR `category` = 3245 OR 
    `category` = 3246 )
    AND `active` = 1 
    AND `price_notax` > 0 
    AND `deleted` = 0 
ORDER BY `position` ASC 
LIMIT 0, 24;
于 2012-10-05T18:59:53.163 に答える