これはかなり簡単な質問だと思いますが、何度もこの問題に遭遇し、検索(おそらく何を検索すればよいかわからない)または試行錯誤のいずれでも解決策を見つけることができません。
次のテーブル構造とデータがあります。
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 inはでtable_b
使用されておらずtable_a
、id3intable_a
の値は0ですtable_b_id
。私がやりたいのは、bの各値がで使用された回数のカウントを取得することです。これにはtable_a
、からの2table_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を使用しています。答えは簡単だと思います。
編集:結合されたクエリ以外の方法はありませんか?