2009-09-16 131 views
0

我有三個表,每個表分別是1:n。 table1中的條目在table2中有n個條目,依此類推。讓我們稱他們爲汽車,輪子和螺絲釘來說明。 螺絲可以清潔(1)或生鏽(2)。我一起加入他們,因爲我想統計兩件事情。首先,我想要有行,告訴我每個車有多少個好/壞的螺絲。所以基本上我越來越:加入子查詢,計數和分組

car_id wheel_id screw_state count(screws) 
    1   1   1   3 
    1   1   2   7 
    1   2   1   5 
    1   2   2   3 
    2   1   1   1 
       ... and so on... 

現在我想第二個事實,我即有多少生鏽和清潔的螺絲有每車所有車輪,而不需要知道每個車輪的每一個具體的數字。 所以基本上我現在只留下斷GROUP BY超過wheel_id,像這樣:

car_id screw_state count(screws) 
    1   1    8 
    1   2   10 
    2   1    1 
       ... and so on... 

的事情是,我需要他們兩個在一個單一的查詢,因爲否則我有大量的排序和重新安排去做。

我相信第二個更容易計算每個汽車的總螺絲數量應該作爲子查詢來完成,但是我可以使用子查詢輕鬆加入第一個更大的查詢嗎?

這是如何完成的?

我會很高興一個相當具體的答案,因爲我不是一個真正的SQL嚮導。

編輯:我正在研究一個ORM,所以像下面這樣怪異的想法(將col值篡改爲某個常量)不能輕易在那裏完成。我必須得到這個解決方案在那裏工作,所以JOIN/subquery/UNIONs沒有時髦的解決方法將是偉大的。

回答

1
SELECT car_id, wheel_id, screw_state, count(screws) 
    FROM cars C, wheels W, screws S 
WHERE W.car_id = C.car_id 
    AND S.wheel_id = W.wheel_id 
GROUP BY car_id, wheel_id, screw_state 
UNION ALL 
SELECT car_id, -1 AS wheel_id, screw_state, count(screws) 
    FROM cars C, wheels W, screws S 
WHERE W.car_id = C.car_id 
    AND S.wheel_id = W.wheel_id 
GROUP BY car_id, screw_state 
ORDER BY car_id 

您可以UNION 2查詢,每輛車所有車輪的第二個查詢,這就是爲什麼wheel_id = -1。

結果:

car_id wheel_id screw_state count(screws) 
     1   1   1   3 
     1   1   2   7 
     1   2   1   5 
     1   2   2   3 
     1   -1   1   8 
     1   -1   2   10 
     2   1   1   1 
     2   -1   1   1 
... 
+0

現在來測試的,可悲的是我的MySQL服務器犯規一樣,「-1 wheel_id」語法。我試圖寫wheel_id = -1,它似乎工作,除了在輸出的事實,wheel_id出來的總計數爲0,而不是-1,但其餘似乎工作。 – Tom 2009-09-16 09:37:10

+0

我使用MS SQL服務器語法,可能對於你必須放置的MySQL:-1 as wheel_id。我在我的答案中解決了它。 – manji 2009-09-16 09:42:21

+0

SELECT car_id,-1,screw_state,count(螺絲)適用於我 – Tom 2009-09-16 10:23:40

1

快速搜索說,MySQL支持GROUPING SETS。這是該功能一個很好的候選人:

SELECT car_id, wheel_id, screw_state, count(screws) 
FROM cars C 
JOIN wheels W ON W.car_id = C.car_id 
JOIN screws S ON S.wheel_id = W.wheel_id 
GROUP BY GROUPING SETS (
    (car_id, screw_state, wheel_id), 
    (car_id, screw_state) 
) 
ORDER BY car_id, wheel_id, screw_state 
+1

好主意,但MySQL不支持分組集。甚至PostgreSQL最近也獲得了這個功能。 – 2009-09-17 11:32:23

+0

@Seun:謝謝你糾正我!我應該檢查MySQL手冊,而不僅僅是谷歌搜索和信任隨機文章。[1] [1] http://www.informit.com/articles/article.aspx?p=664143&seqNum=10&rll=1 – 2009-09-17 22:03:55

+0

沒有問題,如果這個工作,你的答案應該是我的第一選擇,它的更緊湊和優雅。 – Tom 2009-09-17 22:08:23