Aller au contenu

probleme d'ecriture d'une requete sql


robinou

Sujets conseillés

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 :blush:

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

je te conseillerais

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 ;)

Modifié par Bourinho
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous,

cela dit ma requête peut être intéressante dans un autre cas :P

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é par Bourinho
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Petite illustration de la différence entre count(*) et count(expr).

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

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:

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...