MySQL concat UNION GROUP BY результаты строки - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть запрос, чтобы вернуть мне общее количество городов в моей БД.

Хорошо, позвольте мне представить: один человек может иметь свой адрес, но у него также может быть адрес, связанный с его рабочим адресом. И я хочу вернуть общее количество городов, в которых находится человек.

Предположим, у меня есть

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 |
 +---------+---------+-----------+

Как я могу написать свой запрос, чтобы выполнить мне нужные значения. Спасибо!

1 Ответ

2 голосов
/ 12 декабря 2011

Вам просто нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...