Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql查询问题-嵌套和/或语句_Mysql_Sql - Fatal编程技术网

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

mysql查询问题-嵌套和/或语句,mysql,sql,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_

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

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服务器。它只是继续执行查询,而且永远不会结束。我必须手动重新启动服务器。我做错了什么?

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


另一种解决方案是bu two编写两个单独的查询,一个使用所有的like,另一个使用products_id。然后,使用UNION组合这些查询的结果。此解决方案通常比使用带或的复杂表达式更快。从理论上讲,UNION ALL速度更快,但如果两个查询中的条件都匹配,则可能会导致双记录。

当您将OR添加到末尾(假设在最后一个paren之后添加)时,您正在创建笛卡尔连接,因为您正在使放置在WHERE子句中的连接条件无效(
p.products\u id=pd.products\u id
p.products\u id=p2c.products\u id
p2c.categories\u id=c.categories\u 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)

我不明白p.products\u status=1和pd.language\u id=1在您的情况下是什么意思,因此您可能需要调整这些内容在联接中的包含方式。

我知道这并不总是可能的,但是如果您可以将左联接更改为内部联接,嵌套的和/或子句将工作得更快(不会侵入您的联接)

Wow.你知道你也可以对齐和缩进SQL,对吗?你到底在哪里添加OR?在最后一个括号之后?你的from/joins真的很奇怪…我必须运行,但计划稍后检查。是的,对不起,我忘了设置SQL的格式。感谢Fosco的工作。这不是我真正的查询,至少不是全部,我知道t是一个由ZenCart组成的查询,我只是在修改它。是的,我目前正在将OR语句添加到查询的最后一个括号之后。我不能用那种方式修改查询。我应该解释一下,这个查询是(大部分)由ZenCart通过PHP编写。我可以修改其中的一些内容,但就我所知,无法运行两个单独的查询。将OR放在开头的好处是什么?仅速度?我尝试了一下,但得到了相同的结果:mysqld停止响应,我必须手动重新启动。知道为什么会发生这种情况吗?如果查询没有返回行或行一个错误,我可以做一些事情,这样我做不了多少。有没有办法调试这个问题?有没有办法知道服务器运行的最后一个查询做了什么?我真的不能修改那么多查询。嗯,我想我可以,但它会迫使我修改更多的php代码。你能建议一种方法来添加那个OR语句而不修改它吗e查询的其余部分(或尽可能少)?无论如何,我尝试了你的解决方案,似乎效果很好。我不能使用
使用categories\u id
左连接categories c,因为该字段仅存在于categories中,而不存在于其他表中。根据你最初的查询,categories\u id字段同时存在于categories表和products\u to\u categories表中。我希望我们建议修改代码以清理查询,但如果确实无法做到这一点,则只需将连接条件添加到OR子句中,例如
OR(p.products\u id=pd.products\u id和p.products\u id=p2c.products\u id和p2c.categories\u id=c.categories\u id和p.products\u id=3220)
。这至少可以解决您的笛卡尔连接问题,但这会导致一个非常糟糕的查询。