2009-08-12 8 views
28

ich eine SQL-Abfrage haben, sieht ungefähr so ​​aus:Mit Vereinigung und count (*) zusammen in SQL-Abfrage

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

und eine andere, identisch, die aus einem Archiv Ergebnistabelle lädt, aber die Felder sind die gleichen .

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

Wie würde ich die beiden in nur einer Abfrage kombinieren? (So ​​würde die Gruppe nach noch richtig funktionieren). Ich habe versucht mit Union alle, aber es wird nicht funktionieren. Was vermisse ich?

Antwort

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

Vielen Dank. Alles, was mir fehlte, war der "as tem" -Teil ... Vergessen, dass ich den "Tisch" benennen muss, den ich erstelle, damit das funktioniert. –

+5

Dies wird die falsche Antwort geben. In der Tat wird es für jeden Namen eine Zählung von 1 geben, weil UNION standardmäßig UNION DISTINCT ist. UNION ALL verwenden. –

+0

Danke Steve Kass, aber ich wusste schon, dass ich UNION ALL benutzen musste. Wie gesagt, alles was mir fehlte war der "as" Begriff. –

6

Ist Ihr Ziel ...

  1. die Instanzen all "Bob Jones" in beiden Tabellen zählen (zum Beispiel)
  2. die Instanzen all "Bob Jones" zählen in Results in einer Zeile und alle Instanzen von "Bob Jones" in Archive_Results in einer separaten Zeile?

Angenommen, es ist # 1 Sie wollen etwas würde wie ...

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

Wenn Sie Indizes haben die Unterstützung und eine relativ hohe zählt, so etwas wie dies kann deutlich schneller als die Lösungen vorgeschlagen:

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

FYI, dass ich "Both" als reserviertes Wort traf. MySQL 5.1 (btw) – Douglas

+0

Ich denke, anstelle von zwei Spalten, SUM (Count) würde auch funktionieren. – Rana