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
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
Prova:
SELECT NAME, COUNT(*) as c FROM table GROUP BY name ORDER BY c DESC LIMIT 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
Ovviamente, la query esterna non è richiesta qui. ORDER BY COUNT (*) DESC LIMIT 1 farebbe altrettanto bene – Strawberry
È 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.
Basta includere il nome nell'istruzione select per utilizzare group by.
Leggi il Gruppo Per funzione qui ... enter link description here
SELECT MAX(name_count)
FROM
(
SELECT name
,count(*) as name_count
FROM emp1
GROUP BY
name
)
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
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.
***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;
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.
A meno che non siamo particolarmente pedanti, penso che questo fornisca una risposta - sebbene l'ordine per limite sarebbe più normale – Strawberry
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. –
Stai provando a contare il 'nome' e poi restituisci solo il conteggio più alto? – SOfanatic
Non è possibile aggregare un aggregato all'interno dello stesso ambito – Strawberry