SQL Query不过滤正确的数据

时间:2013-05-30 08:09:24

标签: mysql sql database

我有这个问题:

SELECT `gift_donations`.*, `scholarships`.`name` AS scholarship_name
FROM (`gift_donations`)
LEFT
    OUTER JOIN `scholarships` scholarships ON `scholarships`.`id` =
    `gift_donations`.`scholarship_id`
WHERE `gift_donations`.`contact_id` =  '13'
AND
    `gift_donations`.`in_memory` REGEXP '[a-zA-Z]+' OR in_honor REGEXP '[a-zA-Z]+'
ORDER BY
    `gift_donations`.`id` desc

正如您所看到的,我在这里尝试只获取那些contact_id13 的记录,但问题是结果集还包含其他记录{ {1}}不是contact_id

为什么会这样,是因为13还是我没有按照应该只返回REGEXPcontact_id或其他任何其他记录的方式进行查询我想要的号码?

4 个答案:

答案 0 :(得分:5)

AND优先于OR。你应该用第二个AND子句包围这样的括号

(`gift_donations`.`in_memory` REGEXP '[a-zA-Z]+' OR in_honor REGEXP '[a-zA-Z]+')

实际上,你基本上写了以下where子句

A and B or C

由于运算符优先级等同于

(A and B) or (C)

并且必须更改为

(A) and (B or C)

您可以在MySQL Reference Manual

中查找所有运营商优先级

请注意,明确使用括号

总是一个好主意

答案 1 :(得分:1)

使用括号。

WHERE `gift_donations`.`contact_id` =  '13'
AND
   ( `gift_donations`.`in_memory` REGEXP '[a-zA-Z]+' OR in_honor REGEXP '[a-zA-Z]+')
ORDER BY
    `gift_donations`.`id` desc

答案 2 :(得分:1)

您忘记在WHERE子句中添加括号():

SELECT `gift_donations`.*, `scholarships`.`name` AS scholarship_name
FROM (`gift_donations`)
LEFT
    OUTER JOIN `scholarships` scholarships ON `scholarships`.`id` =
    `gift_donations`.`scholarship_id`
WHERE  `gift_donations`.`contact_id` =  '13'
AND
    ( `gift_donations`.`in_memory` REGEXP '[a-zA-Z]+' OR in_honor REGEXP '[a-zA-Z]+' )
ORDER BY
    `gift_donations`.`id` DESC

答案 3 :(得分:0)

这可能是获取contact_id不是13的记录

OR in_honor REGEXP '[a-zA-Z]+'