如何从x等于多个值中选择?

Bin*_*les 58 mysql sql

我正在调试一些代码并遇到以下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
Run Code Online (Sandbox Code Playgroud)

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

这样可以获得所有类型广告的结果,而不仅仅是类型13.

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

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

Gre*_*reg 125

将括号括在"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
)
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,使用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)
Run Code Online (Sandbox Code Playgroud)

  • 我认为IN版本更易于阅读,并且不太可能返回意外结果. (9认同)
  • 至少在MySQL上,它也快得多*** (4认同)

Ned*_*der 21

您可以尝试在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)
Run Code Online (Sandbox Code Playgroud)


Rub*_*ben 14

使用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)
Run Code Online (Sandbox Code Playgroud)