Requête Sql de trie j'arrive pas celle là

WRInaute discret
Bon, après moulte recherche sur le langage SQL, je me décide à demander un conseil ou plutôt une solution si possible...

Je n'arrive pas à trier dans ma base les répétitions de pseudo posteur...
Si le pseudoA postent 10 liens et le posteurB postent 20liens ainsi de suite...

Je voudrais faire un Top Posteur en gros, classé par celui qui a le plus posté.
 
WRInaute occasionnel
voici la structure :

select posteur,count(posteur) as nb_posts from table order by nb_posts desc

ensuite, c'est à adapter en fonction de ta table évidemment ;)
 
WRInaute discret
Merci, j'avance déjà un peu avec votre requête, le truc dont je viens de me rendre compte, c'est que je fais pas d'update, d'un champ nbposts / pseudo, donc j'ai un paramètre manquant...

Donc il faut que je calcule le nb de fois ou on trouve un pseudo que je joigne à une comparaison avec les autres pseudos et que je ressorte un classement ...

Mais je ne vois pas la syntaxe...
 
WRInaute passionné
Code:
--
-- Table structure for table `test`.`post`
--

DROP TABLE IF EXISTS `post`;
CREATE TABLE `post` (
  `IDPost` int(10) unsigned NOT NULL auto_increment,
  `IDPseudo` int(10) unsigned default NULL,
  `link` varchar(45),
  PRIMARY KEY  (`IDPost`),
  KEY `FK_post_1` (`IDPseudo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `test`.`post`
--

/*!40000 ALTER TABLE `post` DISABLE KEYS */;
INSERT INTO `post` (`IDPost`,`IDPseudo`,`link`) VALUES 
 (1,1,'linkA1'),
 (2,1,'linkA2'),
 (3,1,'linkA3'),
 (4,2,'linkB1'),
 (5,2,'linkB2');
/*!40000 ALTER TABLE `post` ENABLE KEYS */;

--
-- Table structure for table `test`.`pseudo`
--

DROP TABLE IF EXISTS `pseudo`;
CREATE TABLE `pseudo` (
  `IDPseudo` int(10) unsigned NOT NULL auto_increment,
  `Pseudo` varchar(45),
  `email` varchar(45),
  `nom` varchar(45) ,
  PRIMARY KEY  (`IDPseudo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `test`.`pseudo`
--

/*!40000 ALTER TABLE `pseudo` DISABLE KEYS */;
INSERT INTO `pseudo` (`IDPseudo`,`Pseudo`,`email`,`nom`) VALUES 
 (1,'PseudoA','pseudoa@example.com','pseudoa'),
 (2,'PseudoB','pseudoB@example.com','pseudob');
/*!40000 ALTER TABLE `pseudo` ENABLE KEYS */;

La requête SQL :
Code:
SELECT pseudo, count(*) as NBPost
FROM pseudo ps INNER JOIN post po ON ps.IDPseudo = po.IDPseudo
GROUP BY pseudo
ORDER BY NBPost desc;


le résultat :
Code:
pseudo	NBPost
PseudoA	3
PseudoB	2
 
WRInaute discret
Merci pour vos réponses rapides, et aussi pour ce script qui m'a grandement aidé, j'ai réussi à faire ce que je voulais ;)
 
WRInaute passionné
Tu auras corrigé de toi même l'erreur grossière qui se cache dans ma requête SQL.

La requête marche mais elle n'est pas du tout optimisée.
Il vaut mieux faire :
GROUP BY IDPseudo => Clé primaire, Int, Champ indexé

plutôt que
GROUP BY Pseudo => Varchar non indexé
 
WRInaute discret
Oui , j'ai un peu modifié l'énoncé des tables.
En fait j'ai créé une seconde table donc comme toi valeurpseudo, pour alimenter un champ lienspost qui pourra subir une comparaison....

J'avais perdu facile 1h car j'avais créé un champ lienspost varchar(50) que je tentais de classer alors que c'est mieux qu'en c'est un entier.

J'ai remanié la déclaration de tables, et les fonctions de requête en m'inspirant de ta vision du problème...

Une chose est sûre, j'aurais bien progressé sur Sql.
Je vais voir encore si je peux optimiser les calculs, et anticiper lorsque les bases seront importantes....

Merci, c'est bien cool.
 
Discussions similaires
Haut