Version complète: sur le forum Webmaster Hub : probleme d'ecriture d'une requete sql
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
robinou
Bonjour à tous,

J'ai un petit probleme en SQL, je n'arrive pas à ecrire ma requete comme je le voudrais sad.gif

Je vous explique:

J'ai une table avec plusieurs données dedans (des noms), il y a plusieurs fois le même nom dans la table.
Ce que je voudrais faire c'est une requete qui selectionne tous les noms de la table, qui me dit combien de fois le meme nom s'y trouve et si un nom se trouve plusieurs fois, la requete ne me l'affiche qu'une seule fois(mais me dit qu'il y est x fois).

J'ai deja fais l'affichage du nombre de fois, mais là où je bute c'est pour l'affichage(une seule fois affiché et pas x fois).

J'espere que vous allez me comprendre blush.gif

si quelqu'un a une petite idée, je l'en remercie énormement.
michmuch51
Salut,

tu devrai essayer ça:
CODE
SELECT COUNT(DISTINCT nom)  FROM tatable
Bourinho
Salut,

je te conseillerais
CODE
SELECT COUNT(*) AS Nb, tatable.nom AS Nom  
FROM tatable
GROUP BY Nom
HAVING Nb>1
ORDER BY Nb DESC


Cela te classera les resultats par nombre d'occurance decroissant (si tu ne veux pas, enleve "ORDER BY Nb DESC")
en ne prenant en compte que ceux qui apparaissent plus d'une fois (si tu ne veux pas, enleve "HAVING Nb>1")

PS : Je crois que le requete de michmuch te donnera le nombre de Noms differents apparaissant dans ta table...et ce n'est pas ce que j'ai compris en lisant ta question wink.gif
michmuch51
Tu as raision Bourinho,

au temps pour moi...

cela dit ma requête peut être intéressante dans un autre cas tongue.gif
sarc
Bonjour,

Bourinho, un count(*) est peu optimisé, à mon avis, on m'a en tout cas toujours déconseillé les étoiles dans les requètes SQL...
Enfin moi pour cette requète, j'aurais juste mis :
CODE
SELECT count(nom) AS nb, nom FROM matable GROUP BY nom
Bourinho
Salut à tous,

CITATION(michmuch51 @ vendredi 21 juillet 2006, 09h16) *
cela dit ma requête peut être intéressante dans un autre cas tongue.gif

C'est vrai...c'est un point de vue qui se défend!!! wink.gif

CITATION(sarc @ vendredi 21 juillet 2006, 09h48) *
Bourinho, un count(*) est peu optimisé, à mon avis, on m'a en tout cas toujours déconseillé les étoiles dans les requètes SQL...
Enfin moi pour cette requète, j'aurais juste mis :
CODE
SELECT count(nom) AS nb, nom FROM matable GROUP BY nom

C'est vrai que pour le "COUNT(*)", je ne sais pas si c'est la façon la plus optimisée...mais si tu veux optimiser, je pense qu'il faut aller jusqu'au bout!!!
CODE
SELECT count(MATABLE.nom) AS nb, MATABLE.nom FROM matable GROUP BY nom

Le fait de préciser de quelle table tu tires le champs "Nom" est plus propre et certainement un chouia plus rapide... en tout cas, cela supportera une eventuelle modification de SQL... wink.gif

A+
captain_torche
Le fait de spécifier des alias de tables, n'est utile que dans le cas où on effectue une requête concernant plusieurs tables (et où par conséquent, il y a un éventuel risque de conflit).
Spidetra
CITATION(sarc @ vendredi 21 juillet 2006, 09h48) *
Bonjour,

Bourinho, un count(*) est peu optimisé, à mon avis, on m'a en tout cas toujours déconseillé les étoiles dans les requètes SQL...
Enfin moi pour cette requète, j'aurais juste mis :
CODE
SELECT count(nom) AS nb, nom FROM matable GROUP BY nom



Qui t'as déconseillé ça ?
C'est exactement le contraire un count(*) est très optimisé, surtout si ton select n'a pas de clause WHERE.

Le pb n'est pas tellement un pb de performance, c'est un pb de sémantique.
count(*) et count(nom) ne compte pas la même chose !
count(*) => retourne une cardinalité
count(nom ) => compte une expression en ignorant les NULL

Dans ce cas, je ne pense pas qu'il y ait bc de différence entre les 2 syntaxes.
robinou
Ca marche trop bien!!!!!!!!!!!!!!!!!!!!!!!!!!!!! smartass.gif smartass.gif smartass.gif

Merci à vous tous.

pour info j'ai utilisé ta methode Bourinho, elle marche super bien a_thumbsup_20.gif

Merci, merci, merci tongue.gif
Bourinho
Salut,

Tant mieux si tu as trouvé ton bonheur, moi, ça m'a permis de consolider mes connaissances!!!

Tout le monde est gagnant sur le Hub! wink.gif

A+
TheRec
Bonjour,

Oui, toujours est-il que Spiderta à raison sur le fait qu'un COUNT(nom_de_champ) n'est pas comparable à un COUNT(*). Je souhaite juste préciser que cela n'est valable qu'avec les tables de type MyISAM et ISAM (et hors utilisation de clause GROUP BY), d'autres type de tables comme InnoDB, ne gardent pas de compteur interne pour un accès rapide (la nature transactionnel de ces autres moteurs est problématique pour ce genre de fonctionnalités).
Le manuel MySQL explique cela clairement concernant les performances.
Spidetra
Petite illustration de la différence entre count(*) et count(expr).

SQL
SELECT superficie, count(superficie), count(*)
FROM villa v
group by superficie;


CODE
superficie    count(superficie)    count(*)
null    0    1
10    7    7
20    3    3
30    5    5
40    6    6


La différence porte sur les NULL.

Ensuite pour les perfs TheRec a raison, ça dépend des implémentations dans les différents SGBD.
J'suis un peu trop catégorique sur ce point whistling.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.