2012-02-24 61 views
6

Estoy realizando varias selecciones y deseo calcular la superposición. Ejemplo:Selección de SQL multiplicidad de elementos en la unión

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

Llamar a estas consultas a, byc, respectivamente. Supongamos que a da (1,2,3,4,5), b da (1,3,5) yc da (4,5,6). Quiero tomar la unión de estos y contar las multiplicidades. Para el ejemplo anterior, el resultado que estoy buscando es

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

¿Cómo hago esto en MySQL5 dentro de una consulta? (Las partes a, b y c pueden ser selecciones simples o procedimientos almacenados).

+0

¿Se han fijado cantidad de tablas y entradas o pueden variar? Puede sustituir cada ID faltante por 0 y luego sumar primero, segundo, tercer elemento, etc. ... Aunque no es una solución elegante – Andrew

+0

Me gustan las multiplicidades ... – Ben

Respuesta

7

No puedo verificar esto en el momento, pero creo que esto va a funcionar

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

Gracias. ¿Sabes si puedo agregar pesos a esto, p. con un peso de 3 en 'baz' mi ejemplo terminaría con' id = 5, multiplicidad = 5; id = 6, multiplicidad = 3'? – spraff

+0

Algo como esto: SELECT id, suma (fullCount) AS multiplicidad DE ( SELECT id, (cuenta (ID) * peso) como fullCount del grupo #foo por id, peso UNION ALL SELECT id, (count (id) * weight) como contador completo DE # grupo de barras por ID, peso UNION TODOS SELECCIONE id, (recuento (id) * peso) como recuento completo de #baz group por ID, peso ) AS TablasTogether GROUP BY id –

0

Aquí hay una versión con formato de la solución ponderada (weight_Foo y weight_Bar son constantes)

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 
Cuestiones relacionadas