RIGHT OUTER JOIN不适用于WHERE子句

时间:2014-08-13 15:36:37

标签: mysql where-clause outer-join

假设我有两个表:

     CREATE TABLE `test_a` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` varchar(20) DEFAULT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

并且

CREATE TABLE `test_b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `A_id` int(11) NOT NULL,
  `Amount` float NOT NULL,
  `cat` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `test_b_ibfk_1` (`A_id`),
  CONSTRAINT `test_b_ibfk_1` FOREIGN KEY (`A_id`) REFERENCES `test_a` (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

在test_a中我输入了数据

1,A
2,B
3,C

在第二个表格中我输入了以下数据: 1,1,4.78,1 2,2,71,1 3,1,2.2,1,1 4,2,13,1

任务是:选择按a_id分组的所有金额的总和,必须显示来自test_a的所有数据。 因此,我正在使用右外连接。 当我运行以下查询时:

SELECT a.name, sum(b.amount)
  FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id
 GROUP BY b.A_id;

根据需要给出结果集。像这样: C - null
A - 5
B - 90

但是当我使用WHERE子句时:

          SELECT a.name, sum(b.amount)
          FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id
          **where b.cat =1**
           GROUP BY b.A_id;

我得到了结果: A - 5
B - 90

我的问题是:如何用WHERE子句实现相同的结果。 (我希望'C - null'出现)

提前感谢!!!

1 个答案:

答案 0 :(得分:1)

您必须在ON条件中包含已连接表b的条件:

SELECT a.name, sum(b.amount) 
FROM 
    test_b AS b 
RIGHT OUTER JOIN 
    test_a AS a 
ON 
    b.A_id = a.id AND b.cat =1 
GROUP BY b.A_id;

因为如果在WHERE子句中使用它会将OUTER JOIN隐式更改为INNER JOIN。