我猜这是一个相当简单的问题,但我已经多次遇到这个问题,我无法通过搜索(也许我不知道要搜索什么)或反复试验找到解决方案。
我有以下表结构和数据:
CREATE TABLE `table_a` (
`id` int(11) NOT NULL auto_increment,
`table_b_id` int(11) NOT NULL,
`field` varchar(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `table_b_id` (`table_b_id`)
);
INSERT INTO `table_a` VALUES(1, 1, 'test 1');
INSERT INTO `table_a` VALUES(2, 1, 'test 2');
INSERT INTO `table_a` VALUES(3, 0, 'test 3');
CREATE TABLE `table_b` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `table_b` VALUES(1, 'value 1');
INSERT INTO `table_b` VALUES(2, 'value 2');
如您所见, id 2 intable_b
未使用 intable_a
并且 id 3 intable_a
的值为 0 table_b_id
。我想要做的是检索 b 中每个值在 中使用的次数的计数table_a
,包括 2 fromtable_b
和所有不在中的值的计数table_b
。
我想出了以下查询:
SELECT b.name, COUNT(a.id) AS number
FROM table_a AS a
LEFT JOIN table_b AS b ON (b.id = a.table_b_id)
GROUP BY a.table_b_id
但它显然只返回以下内容:
name number
-----------------
null 1
value 1 2
如何仅使用 SQL 获得以下信息:
name number
-----------------
null 1
value 1 2
value 2 0
我正在使用 MySQL。我猜答案很简单。
编辑:除了联合查询之外没有其他方法吗?