2009-08-12 2 views
28

J'ai une requête SQL, ressemble à ceci:En utilisant l'union et le nombre (*), ainsi que dans la requête SQL

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

et un autre, identique, qui se charge d'une table de résultats d'archives, mais les champs sont les mêmes .

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

Comment combiner les deux en une seule requête? (Ainsi, le groupe fonctionnerait toujours correctement). J'ai essayé avec tout le monde, mais ça ne marchera pas. Qu'est-ce que je rate?

Répondre

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

Merci. Tout ce qui me manquait était la partie "en tant que" ... J'ai oublié de nommer la "table" que je crée pour que cela fonctionne. –

+5

Cela donnera une mauvaise réponse. En fait, il donnera un compte de 1 pour chaque nom, car UNION est par défaut UNION DISTINCT. Utilisez UNION ALL. –

+0

Merci Steve Kass, mais je savais déjà que je devais utiliser UNION ALL. Comme indiqué ci-dessus tout ce qui me manquait était le "comme" terme. –

6

est votre objectif ...

  1. Pour compter toutes les instances de "Bob Jones" dans les deux tableaux (par exemple)
  2. Pour compter toutes les instances de "Bob Jones" dans Results dans une rangée et toutes les instances de "Bob Jones" dans Archive_Results dans une rangée séparée?

En supposant qu'il est # 1 que vous voudriez quelque chose comme ...

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

Si vous avez des indices de soutien, et compte relativement élevés, quelque chose comme cela peut être beaucoup plus rapide que les solutions suggéré:

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 que j'ai frappé 'Both' comme un mot réservé. MySQL 5.1 (btw) – Douglas

+0

Je pense qu'au lieu de maintenir deux colonnes, SUM (Count) fonctionnerait aussi bien. – Rana

Questions connexes