如何从 x 等于多个值的地方进行选择?

Posted

技术标签:

【中文标题】如何从 x 等于多个值的地方进行选择?【英文标题】:How to do select from where x is equal to multiple values? 【发布时间】: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。

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

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

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于如何从 x 等于多个值的地方进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询从通配符列等于值的所有表中选择所有行[重复]

SQL查询从通配符列等于值的所有表中选择所有行[重复]

如何选择具有多个选择值的数据作为 where 子句? - Ajax Codeigniter

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

if函数如何实现返回值的循环

sql如何选择行=值的多行计数