我有一个由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中的一个错误。
答案 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