2012-10-05 2 views
-1

위의 질문 외에이 MySQL 문을 최적화 할 수있는 방법이 있는지 알고 싶습니다.잘못된 데이터를 표시하는 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; 

이 문은 0, 왜 동일한 price_notax의 필드 값을 가지고있는 제품을 표시하고? 번호가 0보다 높을 필요가 있다고 대답했습니다.

도움이 될만한 의견이 있습니다.

+5

. 또한 물건을 좀 더 읽기 쉽도록 만들기 위해서는 모든 OR 대신 IN() 문을 사용하십시오. – Jeremy

답변

1

이 사실 인 OR 연산 조항 중 하나라도 절이 무관의 상태를 만들 것입니다 사용하지 말아. 이 문제를 해결하려면 대신, IN 절을 사용하여, 그들은 개별적으로 평가되도록

... 괄호와 함께 세트 OR 절을 묶어야합니다 그러나 더 가독성과 같은 일을 달성하기 위해 :

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; 
3

"and"가 "or"보다 우선하고 명세서의 마지막 부분 만 category = 3246으로 "anded"될 것이기 때문에 문제가됩니다. 부품 주위에 대괄호()를 넣어야합니다.

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를 사용하므로 잘못된 결과가 표시되므로 조건 중 하나만 참 (예 : category = 3100) 인 경우 쿼리가 표시됩니다.

1

왜 당신이 그 범주 ID의 배열을 만든 다음

절을 평가하는 경우 WHERE 것을
WHERE category IN somearray 
0

ORAND보다 우선 순위가 낮습니다.

더 정확한 SQL : 당신은 그룹 당신의 관찰 보고서와 AND 연산해야

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; 
관련 문제