假设我有两个表:
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'出现)
提前感谢!!!
答案 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。