par
Hubert Roksor » 28 juin 2006, 20:45
En règle générale, je recommande aux utilisateurs qui ont un problème technique d'exposer ce qu'ils souhaitent obtenir plutôt qu'une façon d'exécuter une certaine action. En l'occurence, ce que tu cherches ce n'est pas vraiment comment faire des UNION et de COUNT(), j'imagine que tu veux le nombre d'utilisateurs pour chaque lettre de l'alphabet en initiale, n'est-ce pas ?
Pour cela tu peux utiliser GROUP BY, même sur un champs qui n'existe pas dans la base. Ce qu'il nous faut, c'est obtenir la première lettre du nom. Pour cela on peut utiliser la fonction SQL
SUBSTRING() et l'utiliser avec GROUP BY. Par exemple:
Code : Tout sélectionner
SELECT SUBSTRING(nom FROM 1 FOR 1) AS initial, COUNT(*) as user_cnt
FROM users
GROUP BY initial
Pour info, j'utilise SUBSTRING() plutôt que LEFT() pour des raisons de compatibilité entre les bases de données. "user_cnt" est le diminutif de "user count". Attention à la collation de ta table, il se pourrait que "A" soit compté séparemment de "a". Si tu exécutes régulièrement cette requête, crée un nouveau champs "CHAR(1) NOT NULL BINARY" contenant l'initiale du nom en minuscule et indexe-le. La requête deviendra instantannée.
En règle générale, je recommande aux utilisateurs qui ont un problème technique d'exposer ce qu'ils souhaitent obtenir plutôt qu'une façon d'exécuter une certaine action. En l'occurence, ce que tu cherches ce n'est pas vraiment comment faire des UNION et de COUNT(), j'imagine que tu veux le nombre d'utilisateurs pour chaque lettre de l'alphabet en initiale, n'est-ce pas ?
Pour cela tu peux utiliser GROUP BY, même sur un champs qui n'existe pas dans la base. Ce qu'il nous faut, c'est obtenir la première lettre du nom. Pour cela on peut utiliser la fonction SQL [url=http://dev.mysql.com/doc/refman/4.1/en/string-functions.html#id2678491]SUBSTRING[/url]() et l'utiliser avec GROUP BY. Par exemple:
[code]SELECT SUBSTRING(nom FROM 1 FOR 1) AS initial, COUNT(*) as user_cnt
FROM users
GROUP BY initial[/code]
Pour info, j'utilise SUBSTRING() plutôt que LEFT() pour des raisons de compatibilité entre les bases de données. "user_cnt" est le diminutif de "user count". Attention à la collation de ta table, il se pourrait que "A" soit compté séparemment de "a". Si tu exécutes régulièrement cette requête, crée un nouveau champs "CHAR(1) NOT NULL BINARY" contenant l'initiale du nom en minuscule et indexe-le. La requête deviendra instantannée.