2012-01-20 19 views
7

Sto tentando di contare le occorrenze di un insieme distinto di città e paesi in una tabella utente.Conteggio delle occorrenze di più colonne distinte in SQL

La tabella è simile a:

userid city  country 
------ --------- -------------- 
1  Cambridge United Kingdom 
2  London  United Kingdom 
3  Cambridge United Kingdom 
4  New York United States 

Che cosa ho bisogno è un elenco di ogni città, coppia di paese con il numero di occorrenze:

Cambridge, United Kingdom, 2 
London, United Kingdom, 1 
New York, United States, 1 

Attualmente mi esegue una query SQL per ottenere le coppie distinte:

$array = SELECT DISTINCT city, country FROM usertable 

quindi leggerlo in un array in PHP e scorrere attraverso il array, l'esecuzione di una query per contare ogni occorrenze per ogni riga della matrice:

SELECT count(*) FROM usertable 
WHERE city = $array['city'] 
AND country = $array['country'] 

Sto assumendo mia stretta scarsa di SQL manca qualcosa - quale sarebbe il modo corretto per farlo, preferibilmente senza l'intervento di PHP?

risposta

13
select city, country, count(*) 
from usertable 
group by city, country 
+0

Straordinaria velocità di risposta - grazie mille, ha funzionato perfettamente (accetterà risposta non appena me lo consente) –

5

Quello che vi serve è un gruppo da:

Select city, country, count(*) as counter 
from usertable 
group by city, country 
+0

Grazie per la risposta molto rapida - perfetta! –

1
SELECT cityandcountry, count(*) as occurrences FROM (
    SELECT DISTINCT concat(city, country) FROM tablename 
) as baseview; 

se volete città e campagna preformattato, o

SELECT cityandcountry, count(*) as occurrences FROM (
    SELECT DISTINCT city, country FROM tablename 
) as baseview; 

in caso contrario.

+0

Grazie - provare questo in MySQL e ottenere il seguente errore: 'Ogni tabella derivata deve avere il proprio alias' –

+0

Mi dispiace, il mio male. Ho modificato la mia risposta per correggerlo. –

+0

Credo che questo non funzionerà. Ogni 'count (*)' sarà solo il numero totale di righe in 'baseview', che non è quello che l'OP voleva. –

Problemi correlati