我有这个问题:
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_id
为13
的记录,但问题是结果集还包含其他记录{ {1}}不是contact_id
为什么会这样,是因为13
还是我没有按照应该只返回REGEXP
为contact_id
或其他任何其他记录的方式进行查询我想要的号码?
答案 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)
中查找所有运营商优先级
请注意,明确使用括号
总是一个好主意答案 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]+'