SELECT COUNT (nom DISTINCT), id, adresse des utilisateurs
Question
Avec PHP, j'essaie de lancer une requête SQL et de sélectionner des colonnes normales ainsi que 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>";
}
Le problème est que, lorsque j'ai "COUNT (nom DISTINCT)", dans ma requête, il ne retournera que la première entrée. Lorsque je le supprime, il renvoie toutes les entrées correspondantes de la base de données.
Je pourrais le séparer et faire 2 requêtes, mais j'essaie d'éviter cela en raison de problèmes de performances.
Qu'est-ce que je fais mal? merci, mexx
La solution
La possibilité de mélanger des colonnes normales et des fonctions d'agrégation est une (mauvaise) fonctionnalité de MySQL. Vous pouvez même lire pourquoi c'est si dangereux dans la documentation de MySQL: https://dev.mysql.com/doc/ refman / 5.6 / fr / group-by-extensions.html
Mais si vous voulez vraiment mélanger des lignes normales et un résumé dans une seule requête, vous pouvez toujours utiliser l'instruction UNION:
SELECT COUNT(DISTINCT name), null, null FROM users GROUP BY name --summary row
UNION
SELECT name, id, address FROM users --normal rows
Autres conseils
COUNT ()
est une fonction d'agrégation, elle agrège les résultats du reste de votre requête. Si vous voulez compter tous les noms distincts, et pas seulement les noms distincts associés aux id
et à adresse
que vous sélectionnez, vous devrez alors exécuter deux requêtes. . Voilà comment SQL fonctionne.
Notez que vous devriez également avoir une clause groupe par
lors de l'agrégation. Je pense que le fait que MySQL ne l’impose pas est horrible et encourage de très mauvaises habitudes.
D'après ce que j'ai compris, vous voulez obtenir:
- une ligne par utilisateur, pour obtenir chaque nom / id / adresse
- une ligne pour plusieurs utilisateurs à la fois, pour obtenir le nombre d'utilisateurs qui portent le même nom.
Ce n’est pas tout à fait possible, je dirais.
Comme vous l'avez dit, une solution consisterait en deux requêtes ...
... Ou, dans votre cas, vous pourriez faire le décompte du côté de PHP, je suppose.
ie, ne comptez pas dans la requête, mais utilisez une boucle supplémentaire dans votre code PHP.
Lorsque vous avez un compte () dans la liste des champs, vous devez regrouper le reste des champs. Dans votre cas, ce serait
select count(distinct name), id, adress from users group by id, adress
select count(distinct name), id, adress
from users
group by id, adress
Je suppose que vous souhaitez obtenir tous vos utilisateurs et le nombre total dans la même requête.
Essayez
select name, id, address, count(id) as total_number
from users
group by name, id, address;