1

次のように2つのテーブルがあります。

table_a: id, title
table_b: id, table_a_id, status

table_a の各値に対して table_b のエントリの総数と、table_a を参照しない table_b のエントリの総数を選択したいと考えています。

たとえば、table_a に次の値があるとします。

{id, title}
(1, "Value 1")
(2, "Value 2")
(3, "Value 3")

table_b には次のエントリがあります

{id, table_a_id, status}
(1, 1, 'open')
(2, 1, 'closed')
(3, -, 'open')
(4, 2, 'closed')

私が取得しようとしているのは、次のようなものです。

("Value 1", 2)
("Value 2", 1)
("Value 3", 0)
(-, 1)

null がなければ、これを次のように書くことができます。

SELECT table_a.id, table_a.title, count(table_b.id) 
FROM table_a 
    LEFT JOIN table_b ON table_a.id = table_b.table_a_id
GROUP BY table_a.id, table_a.title

ただし、table_a を参照しない table_b のエントリの値はわかりません。結合を逆にすると、table_b からすべての値を取得できますが、table_a からは取得できません。1 つのクエリで両方を取得するにはどうすればよいですか?

4

2 に答える 2

2

私は SQL Server を使用していますが、MySQL でも適切に動作すると思います。ここで最も重要なのはCOALESCE関数であり、MySQL は SQL Server と同じ方法で関数を実行します

SELECT COALESCE(a.title, '-'), COUNT(b.id)
FROM #table_b b
LEFT JOIN #table_a a ON b.table_a_id = a.id
GROUP BY a.title
UNION
SELECT a.title, 0
FROM #table_a a
LEFT JOIN #table_b b  ON b.table_a_id = a.id
WHERE b.id IS NULL
于 2013-07-23T20:21:34.540 に答える
1

次のようなものを試してください

SELECT 
  table_a.id, 
  count(table_b.id) 
FROM table_a 
    LEFT JOIN table_b ON table_a.id = table_b.table_a_id
GROUP BY table_a.id 

UNION

SELECT 
  table_a_id, 
  count(table_b.id) 
FROM table_b 
WHERE table_a_id not in (
  SELECT id from table_a
)    
GROUP BY table_a_id 

http://sqlfiddle.com/#!2/f7d1b/6

于 2013-07-23T20:33:41.763 に答える