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

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top