2011-04-06 48 views
3

我已經得到了下表佈局:的MySQL GROUP BY多列不同表

Table Data 
+----------+-------------------------+ 
| Field | Type     | 
+----------+-------------------------+ 
| type  | enum('type_b','type_a') | 
| type_id | int(11) unsigned  | 
| data  | bigint(20) unsigned  | 
+----------+-------------------------+ 

Table A and B: 

+--------------+------------------+ 
| Field  | Type    | 
+--------------+------------------+ 
| id   | int(11) unsigned | 
| customer_id | int(11) unsigned | 
| ...        | 
+--------------+------------------+ 

在表中的數據有來自某一類型(A或B)的一些messurement數據。 現在,我想永遠爲客戶提供這兩種類型的數據a和b的總和。

所以,我想:選擇總和,加入a或b和由a.customer_id,b.customer_id組。

在下面的查詢得到的:

SELECT sum(d.data) as total 
FROM data d, ta, tb 
WHERE 
(d.type LIKE "type_a" AND d.type_id = ta.id) 
OR 
(d.type LIKE "type_b" AND d.type_id = tb.id) 
GROUP BY ta.customer_id, tb.customer_id; 

這並不讓我正確的結果......

我試了幾種方法,左加入,加入的客戶表和組由客戶.id等。有沒有人有線索我做錯了什麼?

Thanx!

+0

其中是表別名? 「ta as a」,「tb as b」 – 2011-04-06 10:03:33

+0

啊,你說得對:)這不是真正的查詢而是簡單的查詢。修復。 – 2011-04-06 10:07:28

回答

3

您的查詢

SELECT sum(d.data) as total 
FROM data d, ta, tb 
WHERE 
(d.type LIKE "type_a" AND d.type_id = ta.id) 
OR 
(d.type LIKE "type_b" AND d.type_id = tb.id) 
GROUP BY a.customer_id, b.customer_id; 

比方說,只有一個在d記錄,並且它是TYPE_A。每個ta和tb中有兩個記錄。 d中的記錄與d.type_id=ta.id上的ta中的一條記錄相匹配。因此,(d x ta)的組合允許任何tb記錄保留在最終結果中。你會得到一個意想不到的笛卡爾產品。

SELECT x.customer_id, SUM(data) total 
FROM 
(
    SELECT ta.customer_id, d.data 
    FROM data d JOIN ta 
     ON (d.type LIKE "type_a" AND d.type_id = ta.id) 
    UNION ALL 
    SELECT tb.customer_id, d.data 
    FROM data d JOIN tb 
     ON (d.type LIKE "type_b" AND d.type_id = tb.id) 
) X 
GROUP BY x.customer_id; 
+0

哇,快!事實上,問題和解決方案。 Thanx Richard!我完成世界另一端的謙虛高貴:) – 2011-04-06 10:23:17