2014-04-03 90 views
1

我目前正在研究我项目的最后一个方面,希望构建一个动态匹配函数。一旦我得到这个查询工作,我就会把它解决了,问题是它返回错误的值 SQL长查询问题

SELECT `Advert_ID`, `User_ID`, `Username` FROM adverts 
WHERE ( `Skill_Proffession_Needed` LIKE 'Plumbing' 
     AND `Skill_Area_Needed` LIKE 'Ceptic' 
     AND `Skill_Level_Needed` LIKE 'Proffessional') 
OR (`Skill_Proffession_Needed` LIKE 'Plumbing' 
     AND `Skill_Area_Needed` LIKE 'Heating' 
     AND `Skill_Level_Needed` LIKE 'Proffessional') 
OR (`Skill_Proffession_Needed` LIKE 'Plumbing' 
     AND `Skill_Area_Needed` LIKE 'Sink' 
     AND `Skill_Level_Needed` LIKE 'Proffessional') 
AND `User_ID` = '16' 
AND `Location_Country` LIKE 'Ireland' 
AND `Location_City` LIKE 'Dublin' AND Active = 1  

问题是,它似乎被忽略了最后4个报表,并返回无效广告和广告无法在该位置。我已经尝试重新安排最后4个AND语句,并将它们放在顶部,并且仍然是同样的错误。我也尝试在OR查询中添加额外的括号来确定优先级,但仍然存在相同的问题。

任何帮助都将是非常有益

回答

3

你需要组织你的查询有一个组的所有OR的喜欢WHERE (all or operations) AND operations

SELECT `Advert_ID`, `User_ID`, `Username` FROM adverts 
WHERE (
    (`Skill_Proffession_Needed` LIKE 'Plumbing' AND `Skill_Area_Needed` LIKE 'Ceptic' AND `Skill_Level_Needed` LIKE 'Proffessional') 
OR (`Skill_Proffession_Needed` LIKE 'Plumbing' AND `Skill_Area_Needed` LIKE 'Heating' AND `Skill_Level_Needed` LIKE 'Proffessional') 
OR (`Skill_Proffession_Needed` LIKE 'Plumbing' AND `Skill_Area_Needed` LIKE 'Sink' AND `Skill_Level_Needed` LIKE 'Proffessional') 
) 
AND `User_ID` = '16' 
AND `Location_Country` LIKE 'Ireland' 
AND `Location_City` LIKE 'Dublin' 
AND Active = 1 
+1

中号哈立德·朱奈德太谢谢你了!这符合预期,我已经多种方式进行测试。我不能够感谢你! :d – IrishFeeney92

0

那是因为你的两个外OR条件被触发。 顺便说一下,如果你不需要使用LIKE,你应该避免使用LIKE,因为它会影响索引访问的方式。

编辑:哈立德Junaid更好地描述我的观点。

1

我猜的操作顺序为“和”和“或”的问题是:SQL Logic Operator Precedence: And and Or

尝试这样的:

SELECT `Advert_ID` 
    ,`User_ID` 
    ,`Username` 
FROM adverts 
WHERE ((
     `Skill_Proffession_Needed` LIKE 'Plumbing' 
     AND `Skill_Area_Needed` LIKE 'Ceptic' 
     AND `Skill_Level_Needed` LIKE 'Proffessional' 
     ) 
    OR (
     `Skill_Proffession_Needed` LIKE 'Plumbing' 
     AND `Skill_Area_Needed` LIKE 'Heating' 
     AND `Skill_Level_Needed` LIKE 'Proffessional' 
     ) 
    OR (
     `Skill_Proffession_Needed` LIKE 'Plumbing' 
     AND `Skill_Area_Needed` LIKE 'Sink' 
     AND `Skill_Level_Needed` LIKE 'Proffessional' 
     )) 
    AND `User_ID` = '16' 
    AND `Location_Country` LIKE 'Ireland' 
    AND `Location_City` LIKE 'Dublin' 
    AND Active = 1