1

我有一个由 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、!= 等,它会返回结果
如果将 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 生成的。

两个数据集完全相同。

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

更新:我刚刚将服务器升级到 5.1.61,查询运行良好。所以看起来这是 5.1.52 中的一个错误。

4

2 回答 2

2

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

WHERE location_reports.id =  1

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

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

于 2012-06-14T11:59:06.487 回答
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
于 2012-06-14T12:09:41.570 回答