【问题标题】:MySQL returns wrong result on PHP search query [closed]MySQL在PHP搜索查询中返回错误结果[关闭]
【发布时间】:2014-06-13 17:35:46
【问题描述】:

这是我的忽略类别字段条件的MySQL查询,结果还返回查询中未提及的其他类别的结果,这是我的mysql查询语句

select *,classifieds.id as id 
from classifieds,classifieds_meta 
where 
    category=1 
    AND meta_key='vehicle_make' 
    and meta_value=2 
    OR meta_key='vehicle_make' 
    and meta_value=3 
    AND (meta_key='vehicle_mileage' and meta_value=9) 
    OR (meta_key='vehicle_mileage' and meta_value=10) 
    OR (meta_key='vehicle_mileage' and meta_value=11) 
    AND classifieds.id=classifieds_meta.classifieds_id 
GROUP BY classifieds.id

上面的 sql 语句返回类别 1 和 6 的结果,而不是只返回 1,有人可以帮忙吗?

【问题讨论】:

  • 您正在选择*,它将从两个表中全选。如果您只想从分类广告中获取所有信息,则应使用classifieds.*
  • 你正在混合使用andor 子句,这肯定会导致不正确的结果,除非你确切地知道你在做什么并且理解mysql的运算符优先规则:dev.mysql.com/doc/refman/5.0/en/operator-precedence.html跨度>
  • 或者直接把category=1这一行改成category = 1 AND category != 6
  • 或者只是将where category=1 AND 之后的所有内容用括号括起来,以便与category=1 分开评估。
  • 现在我已经改进了这样的代码,但仍然没有运气,这是我的代码 select *,classifieds.id as id from classifications,classifieds_meta where category=1 AND (meta_key='vehicle_make' and meta_value =2) OR (meta_key='vehicle_make' and meta_value=3) AND (meta_key='vehicle_mileage' and meta_value=9) OR (meta_key='vehicle_mileage' and meta_value=10) OR (meta_key='vehicle_mileage' and meta_value=11 ) AND 分类.id=classifieds_meta.classifieds_id 按分类分类.id 分组

标签: php mysql sql


【解决方案1】:

尝试在 WHERE 子句中添加括号。 AND 的优先级高于 OR(访问 http://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html):

select *,classifieds.id as id 
from classifieds,classifieds_meta 
where
    category=1 AND (
        meta_key='vehicle_make' 
        and meta_value=2 
        OR meta_key='vehicle_make' 
        and meta_value=3 
        AND (meta_key='vehicle_mileage' and meta_value=9) 
        OR (meta_key='vehicle_mileage' and meta_value=10) 
        OR (meta_key='vehicle_mileage' and meta_value=11) 
        AND classifieds.id=classifieds_meta.classifieds_id
    )
GROUP BY classifieds.id


例如,如果这是在 WHERE 子句中

WHERE row1=1 AND row2=2 OR row3=3

--equal to
WHERE (row1=1 AND row2=2) OR row3=3 

当 row3 等于 3 时, row1 可以是任何值 - 这是你的情况。

【讨论】:

  • 添加更多信息。
【解决方案2】:

您有 4 组由 OR 运算符连接的条件,只有第一组有 'category=1' 条件。如果您只想从第一类中获取,则需要更多括号。喜欢

where category=1 AND (rest of conditions)

【讨论】:

    【解决方案3】:

    ANDOR 布尔运算中有一个优先顺序。

    考虑:

    false AND ( false OR true )   => false
    

    对比

    ( false AND false ) OR true   => true
    

    当您指定时,MySQL 不是不确定

    false AND false OR true
    

    MySQL 有一个特定的优先顺序,我们保证 AND 或 OR 将首先被评估。

    我们可以使用括号指定 MySQL 应该评估操作的顺序。

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 2015-02-26
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 2011-09-22
      • 2015-11-10
      • 1970-01-01
      相关资源
      最近更新 更多