SELEZIONA COUNT (nome DISTINCT), ID, indirizzo dagli utenti
Domanda
Con PHP sto cercando di eseguire una query SQL e selezionare colonne normali e COUNT.
$sql_str = "select COUNT(DISTINCT name), id, adress from users";
$src = mysql_query($sql_str);
while( $dsatz = mysql_fetch_assoc($src) ){
echo $dsatz['name'] . "<br>";
}
Il problema è che quando ho " COUNT (nome DISTINCT), " nella mia query, restituirà solo la prima voce. Quando lo rimuovo, restituirà tutte le voci corrispondenti dal db.
Potrei separarlo e fare 2 query, ma sto cercando di evitarlo a causa di problemi di prestazioni.
Cosa faccio di sbagliato? grazie, Mexx
Soluzione
La capacità di mescolare colonne normali e funzioni di aggregazione è una (mis) caratteristica di MySQL. Puoi persino leggere perché è così pericoloso nella documentazione di MySQL: https://dev.mysql.com/doc/ refman / 5.6 / it / group-by-extensions.html
Ma se vuoi davvero mescolare righe normali e un sommario in una singola query, puoi sempre usare l'istruzione UNION:
SELECT COUNT(DISTINCT name), null, null FROM users GROUP BY name --summary row
UNION
SELECT name, id, address FROM users --normal rows
Altri suggerimenti
COUNT ()
è una funzione aggregata, che si aggrega ai risultati del resto della query. Se vuoi contare tutti i nomi distinti e non solo i nomi distinti associati con id
e indirizzo
che stai selezionando, quindi sì, dovrai eseguire due query . Ecco come funziona SQL.
Nota che durante l'aggregazione dovresti anche avere un group by
. Penso che il fatto che MySQL non lo richieda sia orribile e incoraggia le cattive abitudini.
Da quello che ho capito, vuoi ottenere:
- una riga per utente, per ottenere ogni nome / ID / indirizzo
- una riga per più utenti contemporaneamente, per ottenere il numero di utenti che hanno lo stesso nome.
Questo non è del tutto possibile, direi.
Una soluzione sarebbe, come hai detto tu, due domande ...
... O, nel tuo caso, potresti fare il conteggio sul lato PHP, suppongo.
cioè, non contare nella query, ma usa un ciclo aggiuntivo nel tuo codice PHP.
Quando si dispone di un conteggio () come parte dell'elenco dei campi, è necessario raggruppare il resto dei campi. Nel tuo caso sarebbe
select count(distinct name), id, adress from users group by id, adress
select count(distinct name), id, adress
from users
group by id, adress
Suppongo che desideri ottenere tutti i tuoi utenti e il conteggio totale nella stessa query.
Prova
select name, id, address, count(id) as total_number
from users
group by name, id, address;