SQL выберите множественность элементов в union

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

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 ответов


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

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

вот форматированная версия взвешенного решения (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