1

我有这个查询:

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结果集还包含其他contact_id记录13

为什么会这样,是因为REGEXP还是我没有按照应有的方式进行查询,只带回那些我想要的contact_id13任何其他数字的记录?

4

4 回答 4

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 参考手册中查找所有运算符的优先级

请注意,使用括号明确总是一个好主意

于 2013-05-30T08:13:10.357 回答
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
于 2013-05-30T08:13:41.533 回答
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
于 2013-05-30T08:14:00.740 回答
0

这可能正在获取那些contact_id不是13的记录

OR in_honor REGEXP '[a-zA-Z]+'
于 2013-05-30T08:14:18.923 回答