如何从 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 等于多个值的地方进行选择?的主要内容,如果未能解决你的问题,请参考以下文章
如何选择具有多个选择值的数据作为 where 子句? - Ajax Codeigniter