Суммирование нескольких векторов в одной таблице SQL с использованием GROUP UNION и SUM - PullRequest
0 голосов
/ 11 августа 2011

Я пытаюсь создать запрос, который возвращает счетчики по типу отношений для всех сущностей в таблице.например.

1|VenueName1|0|0|0|

, где 0,0,0 - это количество найденных связей.

В самой таблице содержится множество внешних связей со многими различными типами внешних элементов.Каждая ассоциация может отображаться в таблице «вперед» или «назад», поэтому, например, каждая связь может отображаться одним из двух способов:

|objectTypeId|objectId|associatedId  |associatedTypeId|
|   13       |   1    |     8        |      2         |
|   2        |   8    |     1        |      13        |

Имеет ли смысл?Обычно они появляются только один раз, но могут быть в любом «направлении».Таким образом, чтобы получить общие отношения для данного типа, я использую UNION, подобный следующему:

SELECT ip.id, ip.name, SUM(totalUnion.EventTotals) as Events
 FROM iplace ip

 LEFT JOIN

(

SELECT object_id, count(*) as EventTotals FROM `iassociation` ia
WHERE object_type_id=2 AND associated_object_type_id=14
GROUP BY object_id
UNION ALL

SELECT associated_object_id, count(*) as EventTotals FROM `iassociation` ia
WHERE associated_object_type_id=2 AND object_type_id=14
GROUP BY associated_object_id


) totalUnion ON ip.id = totalUnion.object_id


WHERE ip.type_id IN (4,7,11,15,16) 
GROUP BY ip.id

Это работает нормально. Моя проблема в том, что я хочу сделать то же самое для других 2 типов, даваяеще два SUM (), чтобы показать разные итоги типов отношений для одного объекта.Если я добавлю eextra LEFT JOINs, я получу дублирование строк, и число будет завышено.

Надеюсь, это имеет какой-то смысл.Кто-нибудь может предложить решение?

1 Ответ

0 голосов
/ 11 августа 2011

Для вашего подзапроса вы можете сделать что-то вроде этого:

SELECT
    object_id,
    SUM(CASE WHEN object_type_id = 2 AND associated_object_type = 14 THEN 1 ELSE 0 END) AS event_1,
    SUM(CASE WHEN object_type_id = 5 AND associated_object_type = 8 THEN 1 ELSE 0 END) AS event_2
FROM
    iassociation
UNION ALL
GROUP BY
    object_id
SELECT
    associated_object_id,
    SUM(CASE WHEN associated_object_type = 2 AND object_type_id  = 14 THEN 1 ELSE 0 END) AS event_1,
    SUM(CASE WHEN associated_object_type = 5 AND object_type_id = 8 THEN 1 ELSE 0 END) AS event_2
FROM
    iassociation
GROUP BY
    associated_object_id
...