Я предполагаю, что это довольно простой вопрос, но я сталкивался с этой проблемой несколько раз и не могу найти решение ни с помощью поиска (может быть, я не знаю, что искать), либо пробной и ошибка.
У меня есть следующая структура таблицы и данные:
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');
Как видите, идентификатор 2 в table_b
не используется в table_a
, а идентификатор 3 в table_a
имеет значение 0 для table_b_id
. То, что я хочу сделать, это получить количество раз, которое каждое значение в b используется в table_a
, включая 2 из table_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. Я предполагаю, что ответ прост.
Редактировать: Нет ли другого способа, кроме запроса на объединение?