2011-04-06 82 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