2012-01-15 56 views
0

我需要知道,如果有可能的方式與子查詢出來做這個..SUM acorrding到另一列

這裏是我的表結構:

id-name-father_id 
1 joe 0 
2 mark 0 
3 muller 0 
4 miki 2 
5 timi 2 
6 moses 2 
7 david 1 
8 momo 0 
9 daniel 0 
10 ermi 3 

我的表的邏輯是

  • 0意思是他不是某個人的孩子

  • 1+表示他是那個人中的男人的兒子。

注:如果有一個人有一個孩子,他仍然 將在父親ID 0(這意味着現在在我的表沒有盛大的父親)

我的查詢是:

SELECT id, name, count(id=father_id) as sons 
WHERE father_id = 0 

我想得到的是非兒童的列表(father_id=0)sum 它的孩子。 有沒有一種方法來得到沒有子查詢的結果?

回答

3

這應該這樣做(MySQL的):

SELECT `parents`.`id`, `parents`.`name`, COUNT(`children`.*) AS sons 
FROM `people` AS parents 
LEFT JOIN `people` AS children ON `parents`.`id` = `children`.`father_id` 
WHERE `parents`.`father_id` = 0 
GROUP BY `parents`.`id` 

根據加里我們需要添加nameGROUP BY在其他SQL數據庫:

SELECT `parents`.`id`, `parents`.`name`, COUNT(`children`.*) AS sons 
FROM `people` AS parents 
LEFT JOIN `people` AS children ON `parents`.`id` = `children`.`father_id` 
WHERE `parents`.`father_id` = 0 
GROUP BY `parents`.`id`, `parents`.`name` 

我們正在與自身joing表這裏。所以我們把所有的父母和他們的孩子一起

這將導致這樣的結果:

parents.id parents.name children.id children.name 
1   joe   7   david 
2   mark   4   miki 
2   mark   5   timi 
2   mark   6   moses 
3   muller  10   ermi 
8   momo   -   - # left join allows this line 
9   daniel  -   - 

但是現在我們有了每個父母幾次。因此,我們在GROUP'ing父的id整個事情,這將導致如下:

parents.id parents.name COUNT(children.*) 
1   joe   1 
2   mark   3 
3   muller  1 
8   momo   0 
9   daniel  0 
+1

我認爲你需要添加parents.name到group by子句以及 – Gary 2012-01-15 17:49:34

+0

oops,誤解了你(upvote是爲了提醒我'SELECT'中的name不明確,我需要'parents'.'name');)爲什麼我需要組中的名字?該ID已經是唯一的,不是嗎?名字不會有所作爲。也許我錯了嗎? – Aufziehvogel 2012-01-15 17:52:33

+2

+1值得一提的是,儘管在任何SQL中都可以使用相同的通用方法,但該查詢的某些功能是特定於MySQL的(即在分組查詢的「select」子句中反向引用的名稱和未分類的未分組列)。 – 2012-01-15 18:12:59

2

你應該能夠做到這一點,沒有任何連接或子查詢,如下所示:

select case father_id when 0 then id else father_id end id, 
     max(case father_id when 0 then name end)  name, 
     sum(sign(father_id))       sons 
from table 
group by case father_id when 0 then id else father_id 
+0

我不熟悉「然後是z然後z」的情況,但是對性能問題是有利的...... – dede 2012-01-15 21:26:09

+0

性能不是**糟糕的 - 在關係數據庫中,它通常是邏輯訪問的表, 。在這裏,表只被訪問一次 - 理論上,它應該比任何訪問同一個表的查詢更快,儘管在實踐中(特別是如果表很小),這種差異可能並不重要。 – 2012-01-16 09:06:50