MySQL - 为什么 WHERE 忽略 RIGHT JOIN?
MySQL - Why does WHERE ignore RIGHT JOIN?
我有以下 MySQL 查询:
SELECT inv.inventory_id, inv.item_id, item.description, inv.quantity, item.class_id, class.description AS class,
class.is_spool, inv.location_id, location.description AS location, location.division_id, division.name AS division,
inv.service_date, inv.reel_number, inv.original_length, inv.current_length, inv.outside_sequential,
inv.inside_sequential, inv.next_sequential, inv.notes, inv.last_modified, inv.modified_by
FROM reel_inventory AS inv
INNER JOIN reel_items AS item ON inv.item_id = item.item_id
INNER JOIN reel_locations AS location ON inv.location_id = location.location_id
INNER JOIN locations AS division ON location.division_id = division.location_id
RIGHT JOIN reel_classes AS class on item.class_id = class.class_id;
查询完全按预期工作。我试图做的是使用一个限定符向该查询添加一个 WHERE 子句。例如:
RIGHT JOIN reel_classes AS class ON item.class_id = class.class_id
WHERE inv.current_length > 0;
当我这样做时,RIGHT JOIN 的所有结果都没有包含在结果中。我没有大量的高级查询经验,但是有人可以解释为什么在使用 WHERE 时 RIGHT JOIN 被排除在结果集中之外,以及如何 属性 编写查询以包含 RIGHT JOIN 信息?
提前致谢。
你想要的是:
RIGHT JOIN reel_classes AS class
ON item.class_id = class.class_id AND
inv.current_length > 0;
您的问题是为什么 RIGHT JOIN
变成带有 WHERE
子句的 INNER JOIN
。
原因很简单。对于不匹配的行,inv.current_length
是 NULL
并且比较失败。
我还建议您使用 LEFT JOIN
,从要保留所有行的 table 开始。大多数人发现更容易理解“将所有行保留在第一个 table 中”而不是“将所有行保留在某个 table 中,其名称将出现”。
我有以下 MySQL 查询:
SELECT inv.inventory_id, inv.item_id, item.description, inv.quantity, item.class_id, class.description AS class,
class.is_spool, inv.location_id, location.description AS location, location.division_id, division.name AS division,
inv.service_date, inv.reel_number, inv.original_length, inv.current_length, inv.outside_sequential,
inv.inside_sequential, inv.next_sequential, inv.notes, inv.last_modified, inv.modified_by
FROM reel_inventory AS inv
INNER JOIN reel_items AS item ON inv.item_id = item.item_id
INNER JOIN reel_locations AS location ON inv.location_id = location.location_id
INNER JOIN locations AS division ON location.division_id = division.location_id
RIGHT JOIN reel_classes AS class on item.class_id = class.class_id;
查询完全按预期工作。我试图做的是使用一个限定符向该查询添加一个 WHERE 子句。例如:
RIGHT JOIN reel_classes AS class ON item.class_id = class.class_id
WHERE inv.current_length > 0;
当我这样做时,RIGHT JOIN 的所有结果都没有包含在结果中。我没有大量的高级查询经验,但是有人可以解释为什么在使用 WHERE 时 RIGHT JOIN 被排除在结果集中之外,以及如何 属性 编写查询以包含 RIGHT JOIN 信息?
提前致谢。
你想要的是:
RIGHT JOIN reel_classes AS class
ON item.class_id = class.class_id AND
inv.current_length > 0;
您的问题是为什么 RIGHT JOIN
变成带有 WHERE
子句的 INNER JOIN
。
原因很简单。对于不匹配的行,inv.current_length
是 NULL
并且比较失败。
我还建议您使用 LEFT JOIN
,从要保留所有行的 table 开始。大多数人发现更容易理解“将所有行保留在第一个 table 中”而不是“将所有行保留在某个 table 中,其名称将出现”。