2009-08-12 13 views
28

ho una query SQL, sembra qualcosa di simile:Utilizzando l'unione e il conteggio (*) insieme nella query SQL

select name, count (*) from Results group by name order by name 

e un altro, identico che carica da una tabella dei risultati di archivio, ma i campi sono gli stessi .

select name, count (*) from Archive_Results group by name order by name 

Come combinare i due in una sola query? (Quindi il gruppo funzionerebbe comunque correttamente). Ho provato con il sindacato tutti, tuttavia non funzionerà. Cosa mi manca?

risposta

53
select tem.name, count(*) 
from(select name from results 
union all 
select name from archive_results) as tem 
group by name 
order by name 
+2

Grazie. Tutto quello che mi mancava era la parte "come tem" ... Dimenticavo che dovevo nominare il "tavolo" che ho creato affinché funzionasse. –

+5

Questo darà la risposta sbagliata. Di fatto, darà un conteggio di 1 per ogni nome, poiché UNION è per impostazione predefinita UNION DISTINCT. Utilizzare UNION ALL. –

+0

Grazie a Steve Kass, tuttavia sapevo già che dovevo usare UNION ALL. Come detto sopra, quello che mi mancava era il termine "come". –

6

è il vostro obiettivo ...

  1. di contare tutte le istanze di "Bob Jones" in entrambe le tabelle (per esempio)
  2. di contare tutte le istanze di "Bob Jones" in Results in una riga e tutte le istanze di "Bob Jones" nello Archive_Results in una riga separata?

Supponendo che il numero 1 che ci si vuole qualcosa di simile ...

SELECT name, COUNT(*) FROM 
(SELECT name FROM Results UNION ALL SELECT name FROM Archive_Results) 
GROUP BY name 
ORDER BY name 
7

Se avete sostenere gli indici, e relativamente alta conta, qualcosa di simile a questo può essere notevolmente più veloce rispetto alle soluzioni suggerito:

SELECT name, MAX(Rcount) + MAX(Acount) as TotalCount 
FROM (
    SELECT name, count(*) as Rcount, 0 as Acount 
    FROM Results GROUP BY name 
    UNION ALL 
    SELECT name, 0, count(*) 
    FROM Archive_Results 
    GROUP BY name 
) AS Both 
GROUP BY name 
ORDER BY name; 
+0

A proposito, ho premuto "Entrambi" come parola riservata. MySQL 5.1 (btw) – Douglas

+0

Penso che invece di mantenere due colonne, SUM (Count) funzionerebbe pure. – Rana

Problemi correlati