MYSQL双WHERE子句不能与=和AND一起使用

时间:2012-06-14 11:53:08

标签: mysql

我有一个由DataMapper(CodeIgniter的ORM)生成的查询,它在一台服务器上返回结果,但在另一台服务器上没有。

两个数据库完全相同。该查询适用于具有MYSQL版本5.1.41,5.1.63和5.5.20的服务器,并且在5.1.52上失败。

查询是:

SELECT DISTINCT `clients`.`id`
FROM (`clients`)

LEFT OUTER JOIN `clients_locations`
    clients_locations ON `clients`.`id` = `clients_locations`.`client_id`

LEFT OUTER JOIN `locations`
    locations ON `locations`.`id` = `clients_locations`.`location_id`

LEFT OUTER JOIN `reports`
    location_reports ON `locations`.`id` = `location_reports`.`location_id`

WHERE
    `location_reports`.`id` =  1
AND 
    `clients`.`id` =  2

我做了一些测试,我发现了以下内容:

  

如果你只有1个WHERE子句,它会返回结果   如果您将运算符的任何更改为LIKE,!= etc,则返回结果
  如果将AND更改为OR,则返回结果。

整个网站都使用了类似的查询,所以我不知道为什么这个问题失败了。例如:

SELECT DISTINCT `clients`.`id`
FROM (`clients`)

LEFT OUTER JOIN `clients_locations`
    clients_locations ON `clients`.`id` = `clients_locations`.`client_id`

LEFT OUTER JOIN `locations`
    locations ON `locations`.`id` = `clients_locations`.`location_id`

LEFT OUTER JOIN
    `locations_questionnaires` location_locations_questionnaires 
ON 
    `locations`.`id` = `location_locations_questionnaires`.`location_id`

WHERE
    `location_locations_questionnaires`.`questionnaire_id` =  3
AND 
     `clients`.`id` =  2

在上面列出的所有服务器上返回正确的结果。

有没有人见过这个?

澄清:

我无法编辑SQL,因为它是由ORM生成的。

两个数据集完全相同。

问题是,为什么查询在一台服务器上没有返回任何结果,而另一台服务器上则没有。

UPDATE :我刚刚将服务器升级到5.1.61,查询运行正常。所以看起来它是5.1.52中的一个错误。

2 个答案:

答案 0 :(得分:2)

外连接表上的WHERE条件,例如

WHERE location_reports.id =  1

有效地将外连接转换为内连接。如果将该条件移动到JOIN条件,它将正常工作(正如您已经注意到的那样)。

原因是在 JOIN之后应用了WHERE条件,因为外部连接的行没有location_reports.id的值,条件对于它们是假的,并且它们从结果。

答案 1 :(得分:1)

尝试这样做:

SELECT DISTINCT `clients`.`id`
FROM (`clients`)

LEFT OUTER JOIN `clients_locations`
    clients_locations ON `clients`.`id` = `clients_locations`.`client_id`
    AND `clients`.`id` =  2

LEFT OUTER JOIN `locations`
    locations ON `locations`.`id` = `clients_locations`.`location_id`

LEFT OUTER JOIN `reports`
    location_reports ON `locations`.`id` = `location_reports`.`location_id`
    AND `location_reports`.`id` =  1