J’ai un petit problème avec MySQL. Je tente une requête pour développer un petit script perso pour DotClear2.
L’objectif est de ressortir les X articles qui ont été le plus commenté durant la semaine.
Voici ma requête :
SELECT `post_title`
FROM `dc_post` , `dc_comment`
WHERE `comment_dt` > '2007-01-10 00:00:01'
AND `comment_status` = '1'
GROUP BY `post_id.dc_comment`
ORDER BY count( `post_id.dc_comment` ) DESC
LIMIT 0 , 3
MySQL a répondu:
Le plus étonnant, c’est que ça couille au niveau du count(post_id.dc_comment), alors que la ligne précédente ne retourne pas d’erreur…
Elle est ou ta jointure d’ailleurs (pas la non)? Elle est super chelou ta requete la, meme si on voit vaguement ce que tu veux faire sans voir les schema des tables en question et les FK ca va etre tendu.
Hein? Au mieux il te manque un WHERE dc_post.post_id = dc_comment.post_id (ou un AND … dans le where) si les tables sont organisees comme je pense qu’elles sont, i.e. la jointure. Tu devrais t’assurer d’abord que tu fais les choses une par une en rajoutant la complexite etape par etape: fais ta requete avec juste un group by dans dc_comment, fais un count, fais un order by, fais la jointure avec la table des posts pour choper juste le titre des posts en question.
ORDER BY count( post_id.dc_comment ) DESC < chuis VRAIMENT pas sûr que ça soit faisable ça… d’ailleurs si tu « parses » le truc à la paluche, ça donne ça
ORDER BY (nombre de lignes dans post_id.dc_comment) DESC. et là, clairement, y’a un blem, tu peux pas ordonner ton résultat sur un agrégat.
Ou alors j’ai rien bité aux 2 jours de formation SQL dont je sors B)
Même si ce n’est pas obligatoire, oblige toi à le mettre c’est plus propre, et je ne comprend pas trop la requête, tu fais une jointure entre les tables dc_post et dc_comment et tu fait un Group By sur le champs dc_comment de la table post_id ? Soit je suis totalement à coter de la plaque soit il y a une couille dans le paté.
effectivement, claquer un COUNT derriere un ORDER BY, c’est maaaaaal.
Ton ORDER BY, tu bosses sur les clefs, ou a la rigueur sur des alias (si tu définis des alias dans ta requete)
ensuite, Commentaires et Posts sont dans des tables différentes (je viens de checker sur mon dotclear 1.25
là j’ai la tete dans le cul et mon SQL est trop rouillé pour que je me risque a te pondre une requete, mais le GROUP BY ne se substitue pas a la jointure (le classique WHERE table1.id = table2.id cf ici http://sql.developpez.com/sqlaz/ensembles/ )
C’est quel version de MySQL ? ça change beaucoup de chose. Pour les versions infèrieures à la 4.01, si ma mémoire est bonne, les sous-requêtes notamment ne sont pas acceptées.
edit: raz du message
Pfiou, tu t’embrouilles pour rien, ta requête devra ressembler à ça : [sql]SELECT post_title, nb_comment, post_url FROM dc_post WHERE ((post_status = ‘1’) AND (blog_id = ‘default’) AND (post_dt >= ‘??’)) ORDER BY nb_comment DESC LIMIT 5 ;[/sql]à part pour la date car je sais pas comment on fait. Pas besoin d’aller dans dc_comment compter les commentaires !
Résultat à tester :[sql]SELECT post_title, nb_comment, post_url FROM dc_post WHERE ((post_status = ‘1’) AND (blog_id = ‘default’) AND (post_dt >= DATE_SUB(CURDATE(),INTERVAL 7 DAY))) ORDER BY nb_comment DESC LIMIT 5 ;[/sql]
[quote=“LoneWolf, post:12, topic: 32601”]select count(post_id) as count_post from [blabla jointure sisi c'est oblige la] order by count_post
Idee a la con en passant
LoneWolf
J’ai vu de la lumiere, tout ca…[/quote]
Je plussoie : select [ les champs genre titre, contenu, cout (nombre de commentaires) AS nb ] from [ table1, table2 ] where [ clee = clee etrangere ] order by nb DESC LIMIT [ limite ].
(note que j’ai pas voulu faire de doublon mais peut etre que c’est un tout petit peu plus clair )