2012-02-24 12 views
6

Sto eseguendo diversi selezioni e desidero calcolare la sovrapposizione. Esempio:SQL seleziona più elementi nell'unione

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

Chiamare queste query a, b, e c, rispettivamente. Supponiamo che dia (1,2,3,4,5), b (1,3,5) e c (4,5,6). Voglio prendere l'unione di questi e contare le molteplicità. Per l'esempio sopra, il risultato che sto cercando è

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

Come faccio a fare questo in MySQL5 all'interno di una query? (Le parti a, b, e c possono essere semplici selezioni o stored procedure).

+0

Ti hanno fissato quantità di tabelle e voci o potrebbero variare? È possibile sostituire ogni ID mancante con 0 e quindi sommare il primo, il secondo, il terzo elemento ecc ... Sebbene non sia una soluzione elegante – Andrew

+0

Mi piacciono le moltiplicazioni ... – Ben

risposta

7

non posso verificare questo al momento, ma credo che questo funzionerà

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

Grazie. Sai se posso aggiungere pesi a questo, ad es. con un peso di 3 su 'baz' il mio esempio finirebbe con' id = 5, multiplicity = 5; id = 6, multiplicity = 3'? – spraff

+0

Qualcosa di simile a questo: SELECT id, sum (fullCount) come molteplicità DA ( SELECT id, (count (id) * peso) come fullCount del gruppo #foo da id, peso UNION ALL SELECT id, (count (id) * weight) come fullcount FROM #bar group per id, peso UNION ALL ID SELECT, (count (id) * weight) come fullcount FROM #baz group per id, peso ) AS TablesTogether GROUP BY id –

0

Ecco una versione formattata della soluzione ponderata (weight_Foo e weight_Bar sono costanti)

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