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

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top