2011-12-11 2 views
0

나는 내 DB에있는 도시의 합계를 반환하는 쿼리가 있습니다.MySQL concat UNION GROUP BY 행 결과

좋아 나를 소개 할 수 있습니다 : 한 사람이 자신의 주소를 가질 수 있지만, 그는 또한 주소가 자신의 직장 주소와 연관 할 수 있습니다. 그리고 나는 그 사람이있는 도시 전체를 돌려주고 싶다.

내가 결국

Pablo living in Lisbon but working in Porto 
Jim living in Paris and working in Paris 
May living in Lisbon and working in Paris 

I have i should have a result like: 
Paris - 3 
Lisbon - 2 
Porto - 1 

을 가정하면, 내 쿼리는 다음과 같습니다

SELECT 
    entity_address.city as name, 
    entity_address.city as id, 
    COUNT(entity_address.city) as count_all 
FROM `entities` LEFT JOIN enterprises_entities ON entities.id = enterprises_entities.entity_id 
LEFT JOIN entities AS `enterprises` ON enterprises.id = enterprises_entities.enterprise_id 
LEFT JOIN addresses as enterprise_address ON enterprise_address.id = enterprises_entities.address_id 
LEFT JOIN addresses as entity_address ON entity_address.entity_id = entities.id 
LEFT JOIN person_titles ON person_titles.id = entities.title_id AND entities.title_type = 'PersonTitle' 
LEFT JOIN enterprise_activities ON enterprise_activities.id = enterprises.title_id AND enterprises.title_type = 'EnterpriseActivity' 
LEFT JOIN positions ON entities.position_id = positions.id 

WHERE enterprise_address.city != '' OR entity_address.city != '' 
GROUP BY name 

UNION 

SELECT 
    enterprise_address.city as name, 
    enterprise_address.city as id, 
    COUNT(enterprise_address.city) as count_all 
FROM `entities` LEFT JOIN enterprises_entities ON entities.id = enterprises_entities.entity_id 
LEFT JOIN entities AS `enterprises` ON enterprises.id = enterprises_entities.enterprise_id 
LEFT JOIN addresses as enterprise_address ON enterprise_address.id = enterprises_entities.address_id 
LEFT JOIN addresses as entity_address ON entity_address.entity_id = entities.id 
LEFT JOIN person_titles ON person_titles.id = entities.title_id AND entities.title_type = 'PersonTitle' 
LEFT JOIN enterprise_activities ON enterprise_activities.id = enterprises.title_id AND enterprises.title_type = 'EnterpriseActivity' 
LEFT JOIN positions ON entities.position_id = positions.id 

WHERE enterprise_address.city != '' OR entity_address.city != '' 
GROUP BY name 

order by count_all DESC 

LIMIT 5 

확인 쿼리가 이해가 조금 복잡합니다. 내가 좋아하는 받고자하는

+---------+---------+-----------+ 
| name | id  | count_all | 
+---------+---------+-----------+ 
| Lisbon | Lisbon |  5100 | 
+---------+---------+-----------+ 
| Lisbon | Lisbon |  932 | 
+---------+---------+-----------+ 
| Paris | Paris |  430 | 
+---------+---------+-----------+ 
| Porto | Porto |  270 | 
+---------+---------+-----------+ 
| Paris | Paris |  92 | 
+---------+---------+-----------+ 

:

+---------+---------+-----------+ 
| name | id  | count_all | 
+---------+---------+-----------+ 
| Lisbon | Lisbon |  6032 | 
+---------+---------+-----------+ 
| Paris | Paris |  512 | 
+---------+---------+-----------+ 
| Porto | Porto |  270 | 
+---------+---------+-----------+ 
| London | London |  80 | 
+---------+---------+-----------+ 
| Berlin | Berlin |  10 | 
+---------+---------+-----------+ 

이 어떻게 나에게 원하는 값을 수행하기 위해 내 쿼리를 작성할 수 있습니다하지만 내 문제는 내가 것처럼 agrouped 아니에요 결과입니다. 감사합니다.

+0

이 downvote 나에게 이유를 설명해주십시오. – workdreamer

+1

주소 테이블에서 도시를 계산하면 어떨까요? // 나는 downvote하지 않았다 – ncank

+0

@ i-joey 왜냐하면 나는 엔티티를 필터링하고 있기 때문이다. 그리고 난 결과가 필요합니다 – workdreamer

답변

2

당신은 단순히 두 쿼리에서 집계 된 값을 SUM 필요, 즉 :

SELECT t.id, SUM(t.count_all) 
FROM (
    SELECT entity_address.city as id, COUNT(entity_address.city) as count_all 
    FROM /* rest of your first query */ 
    UNION 
    SELECT enterprise_address.city as id, COUNT(enterprise_address.city) as count_all 
    FROM /* rest of your second query */ 
) t 
GROUP BY t.id 
+0

@workdreamer : 또한 외부 쿼리에'UNION' 하위 쿼리에서'LIMIT'을 이동하십시오. –

+0

결과 : 첫 번째 및 두 번째 쿼리에서 그룹을 보존해야했습니다. 이것은 매우 영리한 해결책입니다. 고맙습니다. – workdreamer