robinou Posté 20 Juillet 2006 Posté 20 Juillet 2006 Bonjour à tous, J'ai un petit probleme en SQL, je n'arrive pas à ecrire ma requete comme je le voudrais 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 si quelqu'un a une petite idée, je l'en remercie énormement.
michmuch51 Posté 20 Juillet 2006 Posté 20 Juillet 2006 Salut, tu devrai essayer ça: SELECT COUNT(DISTINCT nom) FROM tatable
Bourinho Posté 21 Juillet 2006 Posté 21 Juillet 2006 (modifié) Salut, je te conseillerais SELECT COUNT(*) AS Nb, tatable.nom AS Nom FROM tatable GROUP BY NomHAVING Nb>1ORDER 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 Modifié 21 Juillet 2006 par Bourinho
michmuch51 Posté 21 Juillet 2006 Posté 21 Juillet 2006 Tu as raision Bourinho, au temps pour moi... cela dit ma requête peut être intéressante dans un autre cas
Sarc Posté 21 Juillet 2006 Posté 21 Juillet 2006 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 : SELECT count(nom) AS nb, nom FROM matable GROUP BY nom
Bourinho Posté 21 Juillet 2006 Posté 21 Juillet 2006 (modifié) Salut à tous, cela dit ma requête peut être intéressante dans un autre cas C'est vrai...c'est un point de vue qui se défend!!! 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 : 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!!! 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... A+ Modifié 21 Juillet 2006 par Bourinho
captain_torche Posté 21 Juillet 2006 Posté 21 Juillet 2006 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 Posté 21 Juillet 2006 Posté 21 Juillet 2006 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 : 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 Posté 21 Juillet 2006 Auteur Posté 21 Juillet 2006 Ca marche trop bien!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Merci à vous tous. pour info j'ai utilisé ta methode Bourinho, elle marche super bien Merci, merci, merci
Bourinho Posté 22 Juillet 2006 Posté 22 Juillet 2006 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! A+
TheRec Posté 22 Juillet 2006 Posté 22 Juillet 2006 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 Posté 22 Juillet 2006 Posté 22 Juillet 2006 Petite illustration de la différence entre count(*) et count(expr). SELECT superficie, count(superficie), count(*)FROM villa vgroup by superficie; superficie count(superficie) count(*)null 0 110 7 720 3 330 5 540 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
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant