Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 03/02/2010, 17h39   #1 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut Simple (?) Requête SQL

Voilà alors avant tout j'avou être débutant en SQL - PHP et Wordpress ^_^ alors pitié, soyez tolérant

Bon, mon problème est celui ci :

J'ai débuté la réalisation d'un blog sous wordpress, et j'aimerais pouvoir afficher dans ma sidebar, les 10 derniers articles commentés de mon blog.

J'ai trouvé du code sur internet qui m'a permis d'obtenir à peu près le résultat que j'attendais :

Code :
<?php
global $wpdb;
$number = 10;
$comments = $wpdb->get_results("SELECT Distinct post_title, comment_post_ID, comment_author, comment_author_url, comment_ID
FROM $wpdb->comments C, $wpdb->posts P 
WHERE C.comment_approved = '1' AND C.comment_post_id = P.ID
ORDER BY C.comment_date_gmt DESC LIMIT $number");?>
 
<h2 align="left">Les 10 derniers articles commentés</h2><br />
 
<ul id="recentcomments">
 
 
 
 
<?php
if ( $comments ) : foreach ($comments as $comment) :
echo '<li class="recentcomments">' . sprintf(__('%2$s commenté par %1$s'), get_comment_author_link(), '<a href="'. get_permalink($comment->comment_post_ID) . '#comment-' . $comment->comment_ID . '">' . get_the_title($comment->comment_post_ID) . '</a>') . '</li>'."\n";
endforeach; endif;
?>
Et voici le résultat obtenu :

- Article 1 commenté par ToTo
- Article 1 commenté par TaTa
- Article 2 commenté par TonTon
- Article 3 commenté par TiTi
- Article 3 commenté par TuTu

(dsl pour le manque d'inspiration hein )

Vous l'aurez compris, je ne veux pas que des mêmes articles de mon blog apparaissent plusieurs fois ici. L'idéal serait :

-Article 1 commenté par ToTo
-Article 2 commenté par TonTon
-Article 3 commenté par TiTi

Alors je me suis renseigné sur le comment du pourquoi, j'ai modifié la requête en essayant de faire un ' distinct ' ainsi que des jointures, mais mon trop faible niveau de compétence dans la matière m'handicape.

En espérant qu'une âme charitable (et douée en sql-php) m'éclaire sur le sujet, je vous remercie d'avance d'avoir pris le temps de lire ce post,

Amicalement,

Omnislash
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/02/2010, 17h41   #2 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 9 911
Par défaut

Pourquoi afficher le commentaire de Toto plutot que celui de Tata pour l'article 1 ?
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 03/02/2010, 17h45   #3 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut

Citation:
Envoyé par sabotage Voir le message
Pourquoi afficher le commentaire de Toto plutot que celui de Tata pour l'article 1 ?
Bah si tu regardes le code, c'est classé par ordre NON chronologique, donc je veux juste avoir le dernier post paru pour chaque articles ^^ Et comme toto a post son comment après TaTa ..
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 03/02/2010, 17h56   #4 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 9 911
Par défaut

Sans le confirmer :
Code sql :
SELECT post_title, comment_post_ID, comment_author, comment_author_url, comment_ID
FROM  $wpdb->posts P 
JOIN $wpdb->comments 
ON C.comment_post_ID = P.ID
WHERE C.comment_approved = 1
GROUP BY P.ID
ORDER BY C.comment_date_gmt
DESC LIMIT $number
(si tu n'as pas de bol, tu auras le premier commentaire )
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 10h55   #5 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut

Citation:
Envoyé par sabotage Voir le message
(si tu n'as pas de bol, tu auras le premier commentaire )
Ahhh ! Merci de ta réponse, je n'ai déjà plus les articles qui se répètent


Cependant j'ai pas de bol comme tu as dis, je me retrouve avec le 1er commentaire xD

tu sais d'où ca peut venir ? ...

Merci encore de tes réponses qui m'aide beaucoup
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 11h53   #6 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 9 911
Par défaut

Dans l'autre sens ?
Code :
ORDER BY C.comment_date_gmt DESC
 
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 11h59   #7 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut

GROUP BY P.ID
ORDER BY C.comment_date_gmt DESC
DESC LIMIT $number


ne marche pas Plus rien ne s'affiche, peut être parce que les deux DESC sont cote a cote ?
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 12h31   #8 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 9 911
Par défaut

oups je n'avais pas vu qu'il trainait en bas
Code sql :
ORDER BY C.comment_date_gmt ASC
LIMIT $number
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 12h37   #9 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut

Citation:
Envoyé par sabotage Voir le message
oups je n'avais pas vu qu'il trainait en bas
Code sql :
ORDER BY C.comment_date_gmt ASC
LIMIT $number
en fait j'ai déjà tester ca avant que tu ne répondes, et ca inverse le sens dans lequel mes articles apparaissent, mais ca me met toujours le 1er commentaire fait, et pas le dernier
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 12h37   #10 (permalink)
Modérateur
 
Avatar de CinePhil
 
Nom : Philippe Leménager
Date d'inscription: août 2006
Localisation: Toulouse
Âge: 46
Messages: 4 747
Envoyer un message via MSN à CinePhil
Par défaut

Essaie plutôt cette requête :
Code SQL :
SELECT t.post_title, c1.comment_post_ID, c1.comment_author, c1.comment_author_url, c1.comment_ID
FROM $wpdb->comments AS c1
INNER JOIN (
  SELECT p.post_title, MAX(c.comment_date_gmt) AS Date_dernier_commentaire
  FROM $wpdb->posts AS p
  INNER JOIN $wpdb->comments AS c ON c.comment_post_id = p.ID
  WHERE c.comment_approved = 1
) AS t ON c1.comment_date_gmt = t.Date_dernier_commentaire
ORDER BY c1.comment_date_gmt DESC
LIMIT $number
__________________
Philippe Leménager.
Futur ingénieur CNAM, ingénieur d'étude à l'École Nationale de Formation Agronomique.

« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ».
(Nicolas Boileau)
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 12h45   #11 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut

Citation:
Envoyé par CinePhil Voir le message
Essaie plutôt cette requête :
Code SQL :
SELECT t.post_title, c1.comment_post_ID, c1.comment_author, c1.comment_author_url, c1.comment_ID
FROM $wpdb->comments AS c1
INNER JOIN (
  SELECT p.post_title, MAX(c.comment_date_gmt) AS Date_dernier_commentaire
  FROM $wpdb->posts AS p
  INNER JOIN $wpdb->comments AS c ON c.comment_post_id = p.ID
  WHERE c.comment_approved = 1
) AS t ON c1.comment_date_gmt = t.Date_dernier_commentaire
ORDER BY c1.comment_date_gmt DESC
LIMIT $number

o_O Du premier coup Monsieur ! Le dernier article commenté à bien été affiché en montrant le dernier post ! Seul soucis maintenant, je ne vois que le dernier article commenté et pas mes 10 derniers >.< Bizarre non ? surtout quand je vois que tu as conservé la variable $number , peut-être une faute de syntaxe ? Ou peut-être est-ce à cause de MAX(c.comment_date_gmt) ?


En tout cas merci de ta réponse

C'est chiant les noobs désolé
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 13h33   #12 (permalink)
Modérateur
 
Avatar de CinePhil
 
Nom : Philippe Leménager
Date d'inscription: août 2006
Localisation: Toulouse
Âge: 46
Messages: 4 747
Envoyer un message via MSN à CinePhil
Par défaut

Que vaut la variable $number ?

La sous-requête (alias 't'), donne la date du commentaire le plus récent pour chaque post.
On fait ensuite une jointure de ce résultat avec la table des commentaires pour avoir les informations des commentaires.

Si tu veux les 10 derniers commentaires, il faut que $number ait pour valeur 10.
__________________
Philippe Leménager.
Futur ingénieur CNAM, ingénieur d'étude à l'École Nationale de Formation Agronomique.

« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ».
(Nicolas Boileau)
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 14h48   #13 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut

Citation:
Envoyé par CinePhil Voir le message
Que vaut la variable $number ?

La sous-requête (alias 't'), donne la date du commentaire le plus récent pour chaque post.
On fait ensuite une jointure de ce résultat avec la table des commentaires pour avoir les informations des commentaires.

Si tu veux les 10 derniers commentaires, il faut que $number ait pour valeur 10.

Oui j'ai compris ta requête, mais même en attribuant la valeur 10 a la variable ca ne marche pas Bien qu'étant débutant, je pense que la variable prend bien la valeur 10 dans ce code la :

Code :
<?php
global $wpdb;
$number = 10;
$comments = $wpdb->get_results("SELECT t.post_title, c1.comment_post_ID, c1.comment_author, c1.comment_author_url, c1.comment_ID
FROM $wpdb->comments AS c1
INNER JOIN (
  SELECT p.post_title, MAX(c.comment_date_gmt) AS Date_dernier_commentaire
  FROM $wpdb->posts AS p
  INNER JOIN $wpdb->comments AS c ON c.comment_post_id = p.ID
  WHERE c.comment_approved = 1
) AS t ON c1.comment_date_gmt = t.Date_dernier_commentaire
ORDER BY c1.comment_date_gmt DESC
LIMIT $number");?>
Ou alors j'ai vraiment rien compris du tout

Merci une fois de plus de ta réponse rapide
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 14h59   #14 (permalink)
Modérateur
 
Avatar de CinePhil
 
Nom : Philippe Leménager
Date d'inscription: août 2006
Localisation: Toulouse
Âge: 46
Messages: 4 747
Envoyer un message via MSN à CinePhil
Par défaut

En principe la variable $number a bien la valeur 10 oui !

Il faudrait essayer d'afficher la requête exacte envoyée au serveur et la lancer dans phpMyAdmin pour voir ce que ça donne.
__________________
Philippe Leménager.
Futur ingénieur CNAM, ingénieur d'étude à l'École Nationale de Formation Agronomique.

« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ».
(Nicolas Boileau)
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 05/02/2010, 15h14   #15 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: juillet 2009
Messages: 26
Par défaut

Ok donc je viens de test la requete directement sous phpmyadmin.

Seulement, je rencontre quelques problèmes (pour changer !)

Voici mon code :

Code :
SELECT t.post_title, c1.comment_post_ID, c1.comment_author, c1.comment_author_url, c1.comment_ID
FROM $wpdb->comments AS c1
INNER JOIN (
  SELECT p.post_title, MAX(c.comment_date_gmt) AS Date_dernier_commentaire
  FROM $wpdb->posts AS p
  INNER JOIN $wpdb->comments AS c ON c.comment_post_id = p.ID
  WHERE c.comment_approved = 1
) AS t ON c1.comment_date_gmt = t.Date_dernier_commentaire
ORDER BY c1.comment_date_gmt DESC
LIMIT $number
donc la impossible pour le serveur de savoir ce que signifie $number, puisque ya pas la déclaration de ma variable dans la requete. Donc j'ai remplacé $number par 10. Est-ce correct niveau syntaxe ? j'imagine que non sinon on ne se serait pas emmerdé à faire la déclaration de ce même $number.

Comment faire alors ?

Voici le message d'erreur que me donne phpmyadmin :

Code :
 MySQL a répondu:Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '->comments AS c1
INNER JOIN (
  SELECT p.post_title, MAX(c.comment_date_gmt) A' at line 2 
Merci encore et encore pour toute l'attention que tu portes à mon problème.
OmnislashS est déconnecté   Envoyer un message privé Réponse avec citation
NEWS PHPFAQ PHPCours PHPSources PHPLivres PHPScripts PHPOutils PHPComparatifsZend Framework

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 23h30.


Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.