sintassi - mysql count



Perché COUNT() mostra solo una riga di tabella? (5)

L'ultima query non è valida per Oracle: ORA-00937: non è una funzione a gruppo singolo. Ciò significa che è necessaria una clausola GROUP BY. Hai trovato una scappatoia nell'implementazione di MySql. Non fare affidamento su una tale query in un sistema di produzione, in una prossima versione di MySql questo potrebbe non funzionare.

Ho il seguente pet tabella nel menagerie del database:

+--------+-------------+---------+------+------------+------------+
| name   | owner       | species | sex  | birth      | death      |
+--------+-------------+---------+------+------------+------------+
| Tommy  | Salman Khan | Lebre   | NULL | 1999-01-13 | 0000-00-00 |
| Bowser | Diane       | dog     | m    | 1981-08-31 | 1995-07-29 |
+--------+-------------+---------+------+------------+------------+

Ora se eseguo la seguente query:

select owner, curdate() from pet;  

Ottengo il seguente risultato:

+-------------+------------+
| owner       | curdate()  |
+-------------+------------+
| Salman Khan | 2016-09-12 |
| Diane       | 2016-09-12 |
+-------------+------------+

L'output mostra tutti i valori del owner e il valore restituito da curdate() in ogni riga.

Ora se eseguo la seguente query:

select owner, count(*) from pet;  

Ottengo il seguente risultato:

+-------------+----------+
| owner       | count(*) |
+-------------+----------+
| Salman Khan |        2 |
+-------------+----------+  

La mia domanda è qual è la differenza tra la funzione curdate() e count() che fa sì che MySQL produca il secondo owner Diane nel primo esempio?


Answer #1

La maggior parte dei sistemi DBMS non consente una funzione di aggregazione come count () con colonne aggiuntive senza un gruppo di; per una ragione. Il DBMS non sa quali colonne raggruppare :-).

La soluzione consiste nel raggruppare la query in base alla colonna del proprietario, in questo modo:

SELECT owner, count(*) FROM pet GROUP BY owner;

Answer #2

Sì, questo di solito accade senza la clausola group by.

http://www.w3schools.com/sql/sql_groupby.asp Dovresti leggere nel link tutto sulla clausola group by.

Tutte le colonne dovrebbero essere menzionate o saranno aggregate o raggruppate per


Answer #3

Solo MySQL ti consente di fare questo tipo di domande.

È sempre necessario specificare tutte le colonne che non sono combinate con una funzione di aggregazione nella clausola GROUP BY . In caso contrario, i dati verranno combinati in 1 riga, con le colonne aggregate impostate correttamente e tutte le altre colonne selezionate in modo casuale o con gli indici.

Quindi ti serve questo:

SELECT owner, count(*) FROM pet GROUP BY owner;

Quale risulterà:

Saknan Khan |  1
Diane       |  1

È questo che intendevi raggiungere?

O forse hai provato a farlo:

SELECT t.owner,
       COUNT(*) as cnt
FROM pet t
CROSS JOIN pet s
GROUP BY t.owner

Quale risulterà in una colonna aggiuntiva con il conteggio totale accanto a ciascun proprietario.


Answer #4

Conta (*) funzione di aggregazione restituisce solo un valore e cioè il numero totale di righe. E la funzione curdate () fornisce solo la data corrente del sistema.





mysql-5.7