【问题标题】:How to do select from where x is equal to multiple values?如何从 x 等于多个值的地方进行选择?
【发布时间】:2008-11-04 12:47:51
【问题描述】:

我在调试一些代码,遇到如下SQL查询(简化版):

SELECT ads.*, location.county 
FROM ads
LEFT JOIN location ON location.county = ads.county_id
WHERE ads.published = 1 
AND ads.type = 13
AND ads.county_id = 2
OR ads.county_id = 5
OR ads.county_id = 7
OR ads.county_id = 9

我从查询中得到了非常奇怪的结果,我认为这是因为第一个 OR 否定了在它之前找到的 AND 运算符。

这会返回所有类型的广告的结果,而不仅仅是类型 13。

每次调用查询时,可能需要查找不同数量的县实体。

任何有关正确方法的帮助将不胜感激。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    在“OR”周围加上括号:

    SELECT ads.*, location.county 
    FROM ads
    LEFT JOIN location ON location.county = ads.county_id
    WHERE ads.published = 1 
    AND ads.type = 13
    AND
    (
        ads.county_id = 2
        OR ads.county_id = 5
        OR ads.county_id = 7
        OR ads.county_id = 9
    )
    

    或者更好的是,使用 IN:

    SELECT ads.*, location.county 
    FROM ads
    LEFT JOIN location ON location.county = ads.county_id
    WHERE ads.published = 1 
    AND ads.type = 13
    AND ads.county_id IN (2, 5, 7, 9)
    

    【讨论】:

    • 我认为IN版本更容易阅读,不太可能返回意外结果。
    • 它也基本上更快,至少在 MySQL 上是这样
    • 在我的情况下,IN 中的值来自另一个选择查询的结果,我该如何处理?
    • 用OR运算符分隔的多个属性“不等于”怎么办?
    【解决方案2】:

    您可以尝试在 OR 表达式周围使用括号来确保您的查询被正确解释,或者更简洁,使用 IN:

    SELECT ads.*, location.county 
    FROM ads
    LEFT JOIN location ON location.county = ads.county_id
    WHERE ads.published = 1 
    AND ads.type = 13
    AND ads.county_id IN (2,5,7,9)
    

    【讨论】:

      【解决方案3】:

      使用 IN 更简单:

      SELECT ads.*, location.county 
        FROM ads
        LEFT JOIN location ON location.county = ads.county_id
        WHERE ads.published = 1 
              AND ads.type = 13
              AND ads.county_id IN (2,5,7,9)
      

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2021-02-09
        相关资源
        最近更新 更多