如何修复MySQL select语句以获得正确的结果

时间:2011-03-05 09:04:28

标签: mysql

如何为我的选择语句

获取正确的结果
SELECT * FROM ads 
WHERE ad_status='1' 
AND ad_region='Location One' OR ad_region='Location Two' OR ad_region='Location Three' 
AND ad_type='For Rent' 
ORDER BY ad_id 
DESC LIMIT 10 

此声明将返回所有ad_type(出租,通缉,待售等),但我只想For Rent

我认为问题出在ad_region,因为有OR。如果没有“OR”(单个位置),结果是正确的。

让我知道。

4 个答案:

答案 0 :(得分:5)

您需要将OR条件放入括号或使用IN

SELECT * FROM ads 
WHERE 
    ad_status='1' 
  AND 
    ad_region IN ('Location One', 'Location Two', 'Location Three')     
  AND 
    ad_type='For Rent' 
ORDER BY ad_id 
DESC LIMIT 10 

答案 1 :(得分:4)

尝试将OR部分括起来:

SELECT * FROM ads 
WHERE ad_status='1' 
AND ( ad_region='Location One' OR
      ad_region='Location Two' OR
      ad_region='Location Three' )
AND ad_type='For Rent' 
ORDER BY ad_id 
DESC LIMIT 10 

AND的优先级高于显示hereOR,因此您在问题中所拥有的内容相当于:

SELECT * FROM ads 
WHERE (ad_status='1' AND ad_region='Location One')
OR ad_region='Location Two'
OR (ad_region='Location Three' AND ad_type='For Rent')
ORDER BY ad_id 
DESC LIMIT 10 

它将为您提供广告状态为1的位置1以及位置2的所有内容以及来自位置3的所有租借广告的所有内容。

答案 2 :(得分:2)

你的逻辑并不完全清楚。您需要将逻辑上的从属子句括在括号中,以便让MySQL知道您的实际需求。

你想要吗

ad_status='1'
    AND (ad_region='Location One' OR ad_region='Location Two' OR ad_region='Location Three')
    AND ad_type='For Rent'

如果你这样做,你可能最好使用IN(),就像这样:

SELECT * FROM ads 
WHERE ad_status='1'
    AND ad_region IN ('Location One', 'Location Two', 'Location Three')
    AND ad_type='For Rent' 
ORDER BY ad_id 
DESC LIMIT 10
;

答案 3 :(得分:1)

只需在第3行附近放置括号,即

SELECT * FROM ads 
WHERE ad_status='1' 
AND (ad_region='Location One' OR ad_region='Location Two' OR ad_region='Location Three')
AND ad_type='For Rent' 
ORDER BY ad_id 
DESC LIMIT 10 

你也可以使用“in”但我试着远离这些,因为它们通常很慢。