2013-05-08 14 views
7

prega fatemi sapere cosa è sbagliato con il seguente comandoCome trovare il conteggio massimo usando mysql?

mysql> select max(count(*)) from emp1 group by name; 
ERROR 1111 (HY000): Invalid use of group function 
+0

Suppongo che ci siano diverse righe nella tabella in cui 'nome' ha lo stesso valore. Vuole trovare il 'nome' con il maggior numero di linee. –

+0

Stai provando a contare il 'nome' e poi restituisci solo il conteggio più alto? – SOfanatic

+0

Non è possibile aggregare un aggregato all'interno dello stesso ambito – Strawberry

risposta

7

Prova:

SELECT NAME, COUNT(*) as c FROM table GROUP BY name ORDER BY c DESC LIMIT 1

1

che avevo al seguente (supponendo ho capito bene quello che vuoi):

select c from 
(
    select count(*) as c, name from emp1 group by name 
) tmp 
order by c desc limit 1 

Seleziona il conteggio più grande tra tutti i conteggi per nome. Ad esempio, se la tabella contiene

Name 
----------------------- 
Test 
Test 
Hello 
World 
World 
World 

La select interna creerebbe un "tavolo" con questi dati

c   Name 
---------------------- 
2   Test 
1   Hello 
3   World 

L'esterno di selezione sarebbe ordinare questo c discendente e selezionare la prima voce, che è 3.

questo può essere ridotto a

select count(*) c from emp1 group by name order by c desc limit 1 
+0

Ovviamente, la query esterna non è richiesta qui. ORDER BY COUNT (*) DESC LIMIT 1 farebbe altrettanto bene – Strawberry

0

È necessario selezionare name al gruppo da essa, quindi utilizzare max() sul risultato di che, come una sottoquery:

select max(count) 
from (
    select 
    name, 
    count(*) as count 
    from emp1 
    group by name) x 

Ho formattato la query in modo puoi vedere cosa sta succedendo, piuttosto che metterlo tutto su una riga come l'hai mostrato. Btw la "x" di he fnf è un alias richiesto per la sottoquery.

0
SELECT MAX(name_count) 
FROM 
     (
     SELECT name 
       ,count(*) as name_count 
     FROM emp1 
     GROUP BY 
       name 
     ) 
+0

C'è un modo per selezionare anche il nome nell'istruzione SELECT più esterna? Quindi, se volessi sapere quale gruppo di nomi era quello con MAX (name_count)? – Logan

1

Stai chiedendo "che cosa c'è di sbagliato con la sua dichiarazione". Questa è la sua dichiarazione:

select max(count(*)) 
from emp1 
group by name; 

ho capisco cosa vuoi dire. Ma un compilatore SQL no. La ragione è semplice. Un dato select può avere solo una clausola group by. E la tua domanda ne sta chiedendo due. Il primo è il nome group by. Il secondo è un'aggregazione su tutti quei risultati.

Il modo corretto di scrivere la query (come ti sembra di intendere) sta usando una subquery:

select max(cnt) 
from (select count(*) as cnt 
     from emp1 
     group by name 
    ) t 

questa è una soluzione perfettamente ragionevole che utilizza solo standard SQL. Altre risposte hanno proposto la soluzione usando la clausola limit, che potrebbe essere un po 'più efficiente.

-2
***Example: 1*** 
SELECT * 
FROM customer 
WHERE customer.ID IN 
     (SELECT customer_id 
     FROM (SELECT customer_id, MAX(cust_count) 
       FROM (SELECT customer_id, 
           COUNT(customer_id) 
           AS cust_count 
         FROM `order` 
         GROUP BY customer_id) AS cust_count_tbl) AS cust_tbl); 


***Example -2*** 

SELECT * 
     FROM customer 
    LEFT JOIN 
     (SELECT customer_id, COUNT(customer_id) AS cc 
     FROM `order` 
     GROUP BY customer_id 
     ORDER BY cc DESC 
     LIMIT 1) AS kk 
    ON customer.ID = kk.customer_id 
    WHERE kk.customer_id = customer.ID; 
4

Dal codice fornito, comprendo che si desidera selezionare il numero più elevato di dipendenti che condividono lo stesso nome.

Il problema con la query è che si sta tentando di applicare più di un livello di aggregazione in un singolo ambito.

Prova questo:

SELECT MAX(Total) FROM (SELECT COUNT(*) AS Total FROM emp1 GROUP BY name) AS Results 

... o questo:

SELECT COUNT(name) FROM emp1 GROUP BY name ORDER BY COUNT(name) DESC LIMIT 1 

Entrambe le query restituiscono lo stesso risultato, ma le loro implementazioni sono diversi.

Usa quello che è il più veloce per te o quello che preferisci.

+1

A meno che non siamo particolarmente pedanti, penso che questo fornisca una risposta - sebbene l'ordine per limite sarebbe più normale – Strawberry

Problemi correlati