Casse tête SQL

Résolu
Shymon Messages postés 150 Statut Membre -  
Shymon Messages postés 150 Statut Membre -
Bonjour à tous,

Je suis sur un petit problème pour une requête SQL :
J'ai une banale table "commentaires" où chaque entrée possède, entre autre, une date (date et heure) et un article associé.
Exemple :

commentaire1 .... 2012-04-22 09:20 .... article1
commentaire2 .... 2012-04-22 18:50 .... article2
commentaire3 .... 2012-04-23 13:10 .... article1
commentaire4 .... 2012-04-23 17:20 .... article2
commentaire5 .... 2012-04-23 07:40 .... article2
commentaire6 .... 2012-04-23 12:00 .... article1

Je cherche une requête qui me renvoie, pour un jour donné, la liste des derniers commentaires postés pour chaque article.
En prenant l'exemple ci-dessus, et pour la date 2012-04-23, ça devrait donc donner :

commentaire3 .... 2012-04-23 13:10 .... article1
commentaire4 .... 2012-04-23 17:20 .... article2

Si quelqu'un masterise le SQL ou a une idée, je suis preneur :D

Shymon

10 réponses

  1. Zep3k!GnO Messages postés 2049 Statut Membre 200
     
    C'est du SQLServer ou du MySQL ?
    0
  2. Shymon Messages postés 150 Statut Membre 59
     
    désolé, c'est du mySQL !
    0
  3. cheese42 Messages postés 890 Statut Membre 120
     
    slt,

    <?php
    $infos = mysql_query("SELECT * FROM commentaires where date='$tadatepostee'");
    $nb1='0';
    while ($donnees1 = mysql_fetch_array($infos) )
    {
    $nb1++;
    ?>
    <table align="center" border="0" cellspacing="0" cellpadding="0" width="600">
    <tr>
    <td width="300">
    <b><?php echo $donnees1['commentaire']; ?></b>,
    le <?php echo date('d/m/Y', $donnees1['date']); ?> à <?php echo date('H:i', $donnees1['date']); ?>,
    <b><?php echo $donnees1['article']; ?></b></td>
    </tr>
    </table><br />
    <?php } ?>
    0
  4. tryan44 Messages postés 1289 Date d'inscription   Statut Membre Dernière intervention   220
     
    Ce n'est pas une bonne idée le tableau à l'intérieure de la boucle while() car ça va construire une table d'une ligne pour chaque tour de boucle.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Zep3k!GnO Messages postés 2049 Statut Membre 200
     
    Pas de problèmes, c'est même mieux à mon goût ;)

    Si c'est du MySQL, je te propose la requête suivante :
    SELECT * FROM commentaires WHERE ton_champ_date BETWEEN '2012-04-23 00:00:00' AND '2012-04-23 23:59:59' ORDER BY ton_champ_date DESC LIMIT 0,2
    
    0
  7. Heremion Messages postés 564 Statut Membre 102
     
    Bonsoir Shymon...

    Moi j'aurais fait un truc du genre
    select 
    	date_commentaire,
    	article,
    	commentaire
    from 	commentaires
    where 
    	(date_commentaire >= trunc(sysdate))
    and	(date_commentaire < trunc(sysdate+1))
    and 	(rownum <= 2)
    group by article,date_commentaire,commentaire
    order by date_commentaire desc, article
    0
    1. Shymon Messages postés 150 Statut Membre 59
       
      Yep, j'avais tenté un truc dans ce genre, mais le problème est que le GROUP BY est exécuté avant le ORDER BY. Donc il prend d'abord un seul commentaire par article (pas forcement le dernier), puis il les range par date ...

      Il faudrait qu'il classe les commentaires par date, puis en selectionne un seul pour chaque article (qui sera donc a priori le dernier ^^). Mais mySQL n'accepte pas que le ORDER BY soit placé avant le GROUP BY ...
      0
    2. Heremion Messages postés 564 Statut Membre 102
       
      Dans ce cas, essaie plutôt un truc du genre

      select 	date_commentaire,
      	article,
      	commentaire
      from (
      	select 
      		date_commentaire,
      		article,
      		commentaire
      	from 	commentaires
      	where 
      		(date_commentaire >= trunc(sysdate))
      	and	(date_commentaire < trunc(sysdate+1))
      	order by date_commentaire desc, article
      	) as temp
      where (rownum <= 2)
      group by article,date_commentaire,commentaire
      
      0
    3. tryan44 Messages postés 1289 Date d'inscription   Statut Membre Dernière intervention   220
       
      Pourquoi faire aussi compliqué?
      Select tes_champs FROM commentaires WHERE id_du_commentaire = id_de_l_article ORDER BY DESC LIMIT 1

      Dans cet exemple, l'identifiant du commentaire correspond à l'identifiant de l'article. On effectue un trie décroissant et on sort uniquement le dernier résultat. Le dernier résultat étant forcément le dernier commentaire enregistré qui correspond à l'article.
      0
    4. Shymon Messages postés 150 Statut Membre 59
       
      désolé, mais aucun des deux ne donne ce que je recherche ...
      0
  8. Shymon Messages postés 150 Statut Membre 59
     
    Merci !
    Mais avec ça, je sélectionne tous les commentaires du jour donné pour chaque article ... or je n'en veut qu'un seul par article, le dernier du jour :)
    0
  9. Zep3k!GnO Messages postés 2049 Statut Membre 200
     
    Rah ok, j'avais pas compris comme ça...
    En 1 seul coup, j'avoue j'ai un peu de mal, tu peux pas le faire en 2 requêtes ?
    1 ou tu sélectionne en Distinct tes articles puis tu boulce dessus et tu utilises ma requete ci-dessus en mettant le limit à 0 , 1 et en ajoutant dans le where un and sur l'article courant de la boucle ?
    0
  10. Shymon Messages postés 150 Statut Membre 59
     
    Merci de votre aide,

    Je pense avoir trouvé un moyen de résoudre le problème en une requête.
    Bon c'est un peu du bricolage, mais ça marche très bien pour moi ;)

    Pour info : je concatène la date (en timestamp unix) et le commentaire, et je cherche le MAX de ce champ concaténé (qui correspondra donc au dernier commentaire). Ensuite il me suffit de séparer la date et le commentaire en PHP ^^

    SELECT MAX(CONCAT_WS('%%', UNIX_TIMESTAMP('date'), 'commentaire')) 
    FROM 'ma_table' 
    WHERE DATE('date') = 2012-04-23 
    GROUP BY 'article'
    
    0
  11. Shymon Messages postés 150 Statut Membre 59
     
    Je pourrais ! Mais en l'occurence, je peux avoir beaucoup d'article et beaucoup de commentaires, donc je préfère faire une seule requête plutôt que autant de requête qu'il y a d'article ...
    0