2012-10-05 89 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和AND运算。此外,为了使事情更具可读性,请使用IN()语句而不是所有这些OR。 – Jeremy

回答

1

当该WHERE子句评估,任何条款或运算是真实的会使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; 
3

这是因为“和”优先于“或”,并且在您的声明中,只有最后一部分将被“绑定”到category = 3246.您需要在括号或部分中放置括号()。

因为你用OR AND,所以如果只是条件之一为真
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 

您的查询显示错误结果(例如,类= 3100),则显示它。

1

你为什么不创建这些类别ID的数组,然后使用

WHERE category IN somearray 
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;