2

これはかなり簡単な質問だと思いますが、何度もこの問題に遭遇し、検索(おそらく何を検索すればよいかわからない)または試行錯誤のいずれでも解決策を見つけることができません。

次のテーブル構造とデータがあります。

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を使用しています。答えは簡単だと思います。

編集:結合されたクエリ以外の方法はありませんか?

4

4 に答える 4

1
SELECT b.name, SUM(case when a.id is null then 0 else 1 end) AS number
FROM table_a AS a
RIGHT JOIN table_b AS b ON (b.id = a.table_b_id)
GROUP BY b.id

null行を取得したい場合、それは特別です。UNIONする必要があると思います。

SELECT b.name, SUM(case when a.id is null then 0 else 1 end) AS number 
FROM table_a AS a
RIGHT JOIN table_b AS b ON (b.id = a.table_b_id)
GROUP BY b.id
UNION
select null, count(1) from table_a where table_b_id not in ( select id from table_b )
于 2009-04-02T03:16:22.850 に答える
1

ここでやりたいことは と呼ばれFULL OUTER JOINます。

今のところ、 にMySQLはこの機能がありません。つまり、 is を使用してエミュレートする必要がありますUNION(これは、単一のクエリで行うので、それほど悪くはありません)。

SELECT  name, SUM(IF(a.id IS NULL, 0, 1))
FROM    table_b b
LEFT JOIN
        table_a a
ON      a.table_b_id = b.id
GROUP BY
        b.id
UNION ALL
SELECT  name, COUNT(*)
FROM    table_a a
LEFT JOIN
        table_b b
ON      b.id = a.table_b_id
WHERE   b.id IS NULL
GROUP BY
        b.id
于 2009-04-02T13:11:54.697 に答える
0

このネストされたクエリはmysql5で機能します

SELECT b.name, (SELECT COUNT( * ) FROM table_a AS a WHERE a.table_b_id = b.id) AS amount FROM table_b AS b
于 2009-04-02T13:01:45.343 に答える
0

Xaprb によるこの投稿では、この問題を解決するためのさまざまな方法について長い議論があります。彼UNIONUNION.

于 2009-04-05T08:54:44.643 に答える