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