SQL выбирает множественность элементов в объединении - PullRequest
6 голосов
/ 24 февраля 2012

Я выполняю несколько операций выбора и хочу вычислить перекрытие.Пример:

SELECT id FROM foo WHERE ...
SELECT id FROM bar WHERE ...
SELECT id FROM baz WHERE ...

Вызовите эти запросы a, b и c соответственно.Предположим, что a дает (1,2,3,4,5), b - (1,3,5), а c - (4,5,6).Я хочу взять их союз и посчитать кратности.Для приведенного выше примера я ищу результат

id | multiplicity
-----------------
1  | 2
2  | 1
3  | 2
4  | 2
5  | 3
6  | 1

Как мне сделать это в MySQL5 в рамках одного запроса?(Части a, b и c могут быть простым выбором или хранимыми процедурами).

Ответы [ 2 ]

7 голосов
/ 24 февраля 2012

Я не могу проверить это в данный момент, но я верю, что это будет работать

SELECT id, count(id) AS multiplicity 
FROM
(
    SELECT id FROM foo WHERE ...
    UNION ALL
    SELECT id FROM bar WHERE ...
    UNION ALL
    SELECT id FROM baz WHERE ...
) AS TablesTogether
GROUP BY id
0 голосов
/ 26 февраля 2012

Вот отформатированная версия взвешенного решения (weight_Foo и weight_Bar являются константами)

SELECT id, sum(fullcount) AS multiplicity
FROM (
    SELECT id, weight_Foo as fullcount FROM Foo WHERE ...
    UNION ALL
    SELECT id, weight_Bar as fullcount FROM Bar WHERE ...
) AS TemporaryTableName
GROUP BY id
...