mysql查询问题 - 嵌套和/或语句

时间:2011-05-21 16:27:32

标签: mysql sql

我有这个运行良好的查询:

SELECT count(distinct p.products_id) as total 
FROM (products p 
        LEFT JOIN manufacturers m 
        USING(manufacturers_id), products_description pd, 
              categories c, products_to_categories p2c ) 
LEFT JOIN meta_tags_products_description mtpd 
          ON mtpd.products_id= p2c.products_id 
          AND mtpd.language_id = 1 
WHERE (p.products_status = 1 AND p.products_id = pd.products_id 
       AND pd.language_id = 1 AND p.products_id = p2c.products_id 
       AND p2c.categories_id = c.categories_id 
       AND (
            (pd.products_name LIKE '%3220%' 
             OR p.products_model LIKE '%3220%' 
             OR m.manufacturers_name LIKE '%3220%' 
             OR (mtpd.metatags_keywords LIKE '%3220%' 
                 AND  mtpd.metatags_keywords !='') 
             OR 
             (mtpd.metatags_description LIKE '%3220%' 
              AND   mtpd.metatags_description !='') 
             OR 
              pd.products_description LIKE '%3220%'
            ) 
           ) 
      )

但我想要搜索那些WHERE子句,或者,如示例中给出一个数字关键字值,只需将其添加到上一个查询中即可搜索产品ID:

 OR (p.products_id=3220)

但由于某种原因,添加会冻结mysql服务器。它只是继续执行查询,它永远不会结束。我必须手动重启服务器。我做错了什么?

3 个答案:

答案 0 :(得分:5)

当您将OR添加到最后(假设您在最后一个paren之后添加它)时,您正在创建一个笛卡尔连接,因为您在WHERE子句中放置了JOIN条件({{1} },p.products_id = pd.products_idp.products_id = p2c.products_id)。另外,为什么要将初始表(产品,制造商,products_description,categories,products_to_categories)放在括号内?相反,尝试更像这样的事情:

p2c.categories_id = c.categories_id

我不明白你的SELECT count(distinct p.products_id) as total FROM products p LEFT JOIN manufacturers m USING(manufacturers_id) LEFT JOIN products_description pd using products_id LEFT JOIN categories c USING (categories_id) LEFT JOIN products_to_categories p2c USING (products_id) LEFT JOIN meta_tags_products_description mtpd ON mtpd.products_id= p2c.products_id AND mtpd.language_id = 1 WHERE (p.products_status = 1 AND pd.language_id = 1 AND ( (pd.products_name LIKE '%3220%' OR p.products_model LIKE '%3220%' OR m.manufacturers_name LIKE '%3220%' OR (mtpd.metatags_keywords LIKE '%3220%' AND mtpd.metatags_keywords !='') OR (mtpd.metatags_description LIKE '%3220%' AND mtpd.metatags_description !='') OR pd.products_description LIKE '%3220%' ) ) ) OR (p.products_id=3220) 意味着什么,所以你可能需要调整它们在JOIN中的含义。

答案 1 :(得分:1)

使用OR比使用AND慢。您可以尝试在这种情况下,将新条件放在WHERE的开头而不是结尾。

另一个解决方案是写两个单独的查询,一个包含所有LIKE,另一个使用products_id。然后,使用UNION组合这些查询的结果。此解决方案通常比使用OR的复杂表达式更快。 UNION ALL在理论上甚至更快,但如果它们与两个查询中的条件匹配,则可能导致双重记录。

答案 2 :(得分:0)

我知道并不总是可行,但是如果你可以将LEFT JOIN更改为INNER JOIN,嵌套的AND / OR子句将更快地运行(它不会侵入你的连接)