2011-04-06 4 views
3

나는 다음 표 레이아웃을 가지고 : 테이블 데이터에서MySQL의 그룹은

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.customer_id, b.customer_id에 의해 a 또는 b와 그룹에 대한 합계를 선택한다. 다음 쿼리의 결과

:

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; 

이 나에게 적절한 결과를 얻을하지 않습니다 ...

I 시도 몇 가지 방법, 왼쪽은 고객이 고객 테이블 그룹에 합류, 조인 .id 등 누군가가 내가 뭘 잘못하고 있는지 단서가 있습니까?

고맙습니다.

+0

테이블 별명은 어디에 있습니까? "ta as a", "tb as b" –

+0

아, 네가 맞아. 이건 실제 질의가 아니라 단순화 된 것이다. 고쳤다. –

답변

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에있는 레코드의 하나와 일치합니다. 그러므로, (d x ta)의 조합은 모든 결핵 레코드가 최종 결과에 남아 있도록 허용합니다. 당신은 의도하지 않은 데카르트 제품을 얻습니다.

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

와우 빨리! 그리고 실제로 정확하게 문제와 해결책. 고맙습니다. 리차드! 세상의 다른면에서 완성 된 내 겸손한 greatings :) –