1

我有2个表如下:

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

我想为 table_a 的每个值选择 table_b 中的条目总数,以及 table_b 中不引用 table_a 的条目总数。

例如,假设 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)

没有空值,我可以这样写:

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_b 中不引用 table_a 的那些条目的值。如果我反转连接,那么我可以从 table_b 中获取所有值,但不能从 table_a 中获取。如何在一个查询中同时获得两者?

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 回答