Commande SQL

quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   -  
quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'aurais besoin de votre aide car je n'arrive pas à faire un commande sql.

J'ai une table nommé comment qui se présente comme ceci :

id | Pseudo | commentaire | commentaire_id | date

Pour l'instant j'ai fais cette requête qui ne fais pas ce que j'attends :

"SELECT DISTINCT commentaire_id FROM comment ORDER BY id DESC"

C'est le DISTINCT qui me pose problème, il me sélectionne la première entrée, donc la plus ancienne alors que j'aimerai que ce soit la plus récente qui soit sélectionner.

Merci de vos réponse.

13 réponses

  1. jisisv Messages postés 3678 Statut Modérateur 936
     
    Eh bien , remplace DESC par ASC.
    De toute manière , si je comprends le contenu de ta table, c'est une construction pourrie.Tu devrais te créer au minimum deux tables:
    * la première contenant les informations utilisateur (id, pseudo, pointure....)
    * une table contenant les commentaires avec une clé étrangère pointant vers l'id de l'utilisateur.

    Tu effectues ensuite les jointures au gré de tes besoins.
    Gates gave ^H sold you the windows.
    GNU gave us the whole house.(Alexandrin)
    1
  2. utena63 Messages postés 23 Statut Membre 1
     
    bonjour,

    essai de faire ton ORDER BY sur "date".
    Sinon essai cette requête:

    SELECT commentaire_id
    FROM comment
    WHERE date = (SELECT max(date)
    FROM comment);
    Elle permet d'avoir le commentaire sur la dernière date récente.

    Celle-ci pour les dates du jour:

    SELECT commentaire_id
    FROM comment
    WHERE date = CURRENT_DATE();
    0
  3. quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Salut,

    Merci de vos réponses.

    Je vous présente mieux mon problème :

    Je possède 2 tables :

    * Une avec les commentaires
    :

    id | titre | pseudo | commentaire | date

    * Un deuxième avec les commentaire des commentaires de la table 1 :

    id | Pseudo | commentaire | commentaire_id | date

    Elle sont jointe grâce au commentaire_id.

    Sur ma page d'accueil des commentaires ( http://www.toucheatoncube.fr/commentaires/index.php ), les commentaires sont classé par id décroissant alors que j'aimerai les classé en fonction du dernier commentaire de commentaire créé. (je sais pas si je suis clair ;) )

    Donc sur une page de test j'essaye des requêtes:

    http://www.toucheatoncube.fr/commentaires1/index.php

    <?php

    /*
    Connexion à la BDD
    */
    require "config.php";
    mysql_connect($adresse, $nom, $motdepasse);
    mysql_select_db($database);
    ?>

    <table id="tableau_forum" border="1">

    <?php
    $sql="SELECT DISTINCT commentaire_id FROM comment ORDER BY id DESC";
    $req = mysql_query($sql) or die(mysql_error());

    while($data = mysql_fetch_assoc($req)) {

    $sql2= "SELECT * FROM commentaires WHERE id = {$data['commentaire_id']}";
    $req2= mysql_query($sql2) or die(mysql_error());

    while($data2 = mysql_fetch_assoc($req2)){
    ?>
    <tr>
    <td><a href="comment.php?id=<?php echo $data2['id']; ?>"><?php echo stripslashes($data2['titre']);?></a></td>
    <td><?php echo stripslashes($data2['pseudo']);?></td>
    <td><?php echo date("d/m/Y G:i", strtotime($data2['date'])); ?></td>
    </tr>
    </tr>
    <?php
    }
    }
    ?>
    </table>

    Merci de votre aide !

    Quistora
    0
  4. utena63 Messages postés 23 Statut Membre 1
     
    Bonjour,

    j'ai modifié tes tables, elles n'allaient pas du tout.
    En fait pour que ça soit plus claire, tu doit t'imaginer 2 phrases qui relient tes tables.
    Ici : une personne écrit un ou plusieurs commentaire(s), et un commentaire est écrit par une et une seul personne.

    Donc voici la traduction de ces phrases avec les tables :

    tables modifiés

    personne
    idPers | pseudo | #idComm ('#' pour clé étrangère, il peut y avoir plusieurs commentaires pour une même personne)

    commentaire
    idComm | commentaire | date

    création des tables en SQL:

    create table personne
    (idPers integer,
    pseudo char(255),
    idComm integer,
    primary key (idPers)
    foreign key (idComm) references commentaire (idComm)
    );

    create table commentaire
    (idComm integer,
    commentaire char(255),
    date date,
    primary key (idComm)
    );

    Afficher les commentaires du plus récent au plus ancien,
    avec le pseudo de la personne et la date:


    Select P.pseudo, C.commentaire, C.date
    From personne as P, commentaire as C
    Where P.idComm = C.idComm
    Order By C.date desc;

    J'espère que ça te sera utile, pour information, étudier les cas comme ça sur les base de donnée c'est du Merise. C'est très pratique pour savoir comment créer des table et quoi mettre dedans.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    je pense que tu n'a pas compris le système que je souhaite :

    car dans ta base, je ne vois pas comment on peut faire pour stocker des commentaires de commentaire !

    Sur ma page d'accueil des commentaires ( http://www.toucheatoncube.fr/commentaires/index.php ), les commentaires (commentaire mère ) sont classé par id décroissant alors que j'aimerai les classé en fonction du dernier commentaire de commentaire ( réponses des commentaire mère ) créé.
    0
  7. utena63 Messages postés 23 Statut Membre 1
     
    Oui en effet j'ai mieux compris ce que tu veux dire par "commentaire de commentaire".

    Gardons la table que j'ai fait précédemment, et rajoute ceci:

    personne
    idPers | pseudo | #idComm ('#' pour clé étrangère, il peut y avoir plusieurs commentaires pour une même personne)

    commentaire
    idComm | commentaire | date

    reponse
    idReponse | commRep | dateRep


    lien
    #idComm | #idReponse


    Requête:

    Select P.pseudo, R.commRep, R.dateRep
    From personne as P, commentaire as C, reponse as R, lien as L
    Where P.idComm = C.idComm
    And R.idReponse = L.idReponse
    And C.idComm = L.idComm
    Order By R.dateRep desc;

    Le format date doit prendre en compte l'heure sinon faut rajouter un champ "heure" dans les tables commentaire et reponse, et rajouter dans "Order By" R.heure desc.
    0
  8. quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Je ne comprend pas les dièses, qu'est ce qu'une "clé étrangère" ?
    0
  9. utena63 Messages postés 23 Statut Membre 1
     
    exemple pour clé étrangère:

    La clé étrangère représente un champ (ou des champs) qui pointe vers la clé primaire d'une autre table. L'objectif de la clé étrangère est d'assurer l'intégrité référentielle des données. En d'autres mots, seules les valeurs devant apparaître dans la base de données sont permises.

    Par exemple, nous avons deux tables, l'une appelée CUSTOMER qui inclut toutes les données du client, et l'autre ORDERS qui comprend ses commandes. La contrainte ici est que toutes les commandes doivent être associées à un client qui se trouve déjà référencé dans la table CUSTOMER. Dans ce cas, une clé étrangère devra être placée sur la table ORDERS et mise en relation avec la clé primaire de la table CUSTOMER. De cette façon, il sera possible d'assurer que toutes les commandes de la table ORDERS sont mises en relation avec un client de la table CUSTOMER. En d'autres mots, la table ORDERS ne peut contenir d'informations sur un client qui ne se trouve pas dans la table CUSTOMER.

    La structure de ces deux tables sera comme suit :

    Table CUSTOMER
    nom de colonne caractéristique
    SID Clé primaire
    Last_Name
    First_Name

    Table ORDERS
    nom de colonne caractéristique
    Order_ID Clé primaire
    Order_Date
    Customer_SID Clé étrangère
    Amount

    Dans l'exemple ci-dessus, la colonne Customer_SID de la table ORDERS représente une clé étrangère pointant vers la colonne SID de la table CUSTOMER.
    ______________________________________________________________

    Dans notre table Lien, c'est une contrainte d'intégrité multiple.
    idComm et idReponse sont à la fois clé primaire et clé étrangère.
    Cette table permet de relier les réponses d'un commentaire.

    ex: le Commentaire 1 a 3 réponse
    Dans la table tu auras:
    idComm | idReponse
    1 | 1
    1 | 2
    1 | 3

    Pour savoir comment tu dois relier tes tables, tu imagines des phrases avec 1 verbe et le nom des tables, comme celles-ci:

    "une personne peut mettre un ou plusieurs commentaires; un commentaire est mis par une et une seul personne."
    Ici on a le mot "plusieurs" qui correspond à la table personne; donc la clé primaire de la table commentaire doit être placé en clé étrangère dans la table personne.

    "un commentaire a une ou plusieurs réponse; une réponse peut être dans un ou plusieurs commentaire."
    Ici on a 2 fois le mot "plusieurs", on doit créer une table pour les relier, la table "lien" est là pour ça. Avec la table "lien" tu peux avoir les réponses par commentaire.
    (En SQL le "par" se traduit GROUP BY)
    0
  10. quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Ok, j'ai un peu mieux compris même si je ne saisis pas tout.
    Avec ton aide, j'ai créé ces tables car c'est ça que je souhaite, peux-tu me dire ce que tu en pense et comment l'améliorer car je pense que c'est largement améliorable ( je débute en php/mysql):

    membres :
    id_membre | pseudo | mdp | nbmessages

    messages :
    id_message | titre | contenu | #id_membre | date

    reponses :
    id_reponse | contenu | #id_membre | date

    liens1 :
    #id_membre | #id_message

    liens2 :
    #id_membre | #id_reponse

    liens3 :
    #id_message | #id_reponse

    Et la requête pour sélectionner les messages en fonction de la dernière réponse créer :

    SELECT M1.pseudo, M2.titre, R.date
    FROM membres AS M1, messages as M2, reponses AS R, liens1 AS L1, liens2 AS L2, liens3 AS L3
    WHERE M1.id_membre = L1.id_membre
    AND M2.id_message = L1.id_message
    AND M2.id_message = L3.id_reponse
    AND R.id_reponse = L3.id_reponse
    ORDER BY R.date DESC;

    Je ne sais pas si sa fonctionne parce je n'ai pas encore tester.

    En tout cas, merci de ton aide.
    0
  11. utena63 Messages postés 23 Statut Membre 1
     
    Oui elle est bien mais il y a quelques erreurs:

    - dans les tables message et réponse faut retirer les clé étrangère id_membre

    - tu as le droit de relier plus de 2 tables dans les contraintes d' intégrités multiples:
    dans lien1 je mettrai plutôt ceci > #id_membre | #id_message | #id_reponse
    le lien2 sera supprimer,
    le lien3 est correct, change le nom en lien2.

    - ta requête avec les modifications :

    SELECT M1.pseudo, M2.titre, R.date
    FROM membres AS M1, messages as M2, reponses AS R, liens1 AS L1
    WHERE M1.id_membre = L1.id_membre
    AND M2.id_message = L1.id_message
    AND R.id_reponse = L1.id_reponse
    ORDER BY R.date DESC;

    Je pense que ça fonctionnera, sinon vérifie les données dans la base avec de modifier la requête.

    lien2 te servira si tu veux connaitre le détail des commentaires uniquement pas par rapport au membre.

    Tu t'es beaucoup amélioré niveau réflexion et analyse, ce qui n'est pas évident, continue comme ça ;)
    0
  12. quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Salut,

    Merci beaucoup pour ton aide précieuse ! ;)

    J'ai pas compris ce que signifie "les contraintes d' intégrités multiples" ?

    Peut-tu m'expliquer ?

    Mes travaux avancent vite grace à ton aide => http://www.toucheatoncube.fr/forum/

    Je n'arrive pas à supprimer les doublons de ma page forum.php

    Voici le code:

    <table id="tableau_forum" border="1" width="100%"> 
      <tr> 
       <th>Titre</th> 
       <th>Auteur</th> 
       <th>Date</th> 
       <th>Réponses</th> 
      </tr> 
      <?php 
     $r['messages_non_rep']=mysql_query(" 
     SELECT M1.pseudo, M1.id_membre, M2.titre, M2.id_message, M2.date 
     FROM membres AS M1, messages as M2, reponses AS R, liens AS L, liens1 AS L1 
     WHERE M1.id_membre = L1.id_membre 
     AND M2.id_message = L1.id_message 
     AND M2.id_message = L.id_message 
     AND L.id_forum = {$forum_id} 
     AND M2.resolu = 0 
     ORDER BY M2.date DESC") or die(mysql_error()); 
      
     while ($message= mysql_fetch_assoc($r['messages_non_rep'])) { 
     ?> 
          <tr> 
           <td><a href="message.php?id=<?php echo $message['id_message']; ?>"><?php echo $message['titre'];?></a></td> 
            <td><?php echo $message['pseudo'];?></td> 
            <td><?php 
      echo $message['date'];?></td> 
      <td>0</td> 
          </tr> 
        <?php 
     } 
      
     $r['message']= mysql_query(" 
     SELECT M1.pseudo, M1.id_membre, M2.titre, M2.id_message, R.date 
     FROM membres AS M1, messages as M2, reponses AS R, liens AS L, liens1 AS L1, liens2 AS L2 
     WHERE M1.id_membre = L1.id_membre 
     AND M2.id_message = L1.id_message 
     AND M2.id_message = L.id_message 
     AND L.id_forum = {$forum_id} 
     AND M2.id_message = L2.id_message 
     AND R.id_reponse = L2.id_reponse 
     ORDER BY R.date DESC") or die(mysql_error()); 
     while ($message= mysql_fetch_assoc($r['message'])) { 
     ?> 
          <tr> 
           <td><a href="message.php?id=<?php echo $message['id_message']; ?>"><?php echo $message['titre'];?></a></td> 
            <td><?php echo $message['pseudo'];?></td> 
            <td><?php echo $message['date'];?></td> 
      <td><?php  
      $r['nbreponses']= mysql_query(" 
      SELECT id_message 
      FROM liens2 
      WHERE id_message = {$message['id_message']}") or die(mysql_error()); 
      $nbreponses= mysql_num_rows($r['nbreponses']); 
      echo $nbreponses; 
      ?></td> 
          </tr> 
        <?php 
     } 
     ?> 
        </table>


    Merci !!!
    0
  13. utena63 Messages postés 23 Statut Membre 1
     
    Voici un exemple claire sur les contraintes d'intégrités:

    "L'association est un lien sémantique entre une ou plusieurs entités : l'association peut être réflexive, de préférence binaire (ex : une usine 'est implantée' dans un pays), parfois ternaire, voire de dimension supérieure. Elle peut également être porteuse d'une ou plusieurs propriétés (ex : 'date d'implantation' d'une usine dans un pays)

    Cette description sémantique est enrichie par la notion de cardinalité, celle-ci indique le nombre minimum (0 ou 1) et maximum (1 ou n) de fois où une occurrence quelconque d'une entité peut participer à une association (ex: une usine est implantée dans un (card. min=1) et un seul (card. max=1) pays; et réciproquement un pays peut faire l'objet soit d'aucune (card. min=0) implantation d'usine soit de plusieurs (card. max=n). Il existe deux types d'associations : les CIF (Contrainte d'intégrité fonctionnelle)et les CIM (contrainte d'intégrité multiple). Les CIF ont pour particularité d'être binaires et d'avoir une card min à 0 ou 1 et une card max à 1, de plus elles sont non porteuses de propriétés. Les CIM sont n-aires et ont toutes leurs cardinalités max à n, de plus elles peuvent être porteuses de propriétés."

    Pour les doublons rajoute DISTINCT(M2.id_message) dans tes requêtes.
    Fait des tests pour voir s'il affiche bien les messages qu'il faut et pas en double.
    0
  14. quistora Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
     
    Salut !!

    Alors je reviens pour te dire que mon forum fonctionne entièrement !

    J'ai quand même un problème que je n'arrive pas à résoudre :

    Je n'arrive toujours pas à supprimer les doublons de ma page forum.php même avec DISTINCT(M2.id_message) :

    SELECT M1.pseudo, M1.id_membre, M2.titre, DISTINCT(M2.id_message), R.date
    FROM membres AS M1, messages AS M2, reponses AS R, liens AS L, liens1 AS L1, liens2 AS L2
    WHERE M1.id_membre = L1.id_membre
    AND M2.id_message = L1.id_message
    AND M2.id_message = L.id_message
    AND L.id_forum = {$forum_id}
    AND M2.id_message = L2.id_message
    AND R.id_reponse = L2.id_reponse
    ORDER BY R.date DESC


    Voila l'erreur :

    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 'DISTINCT(M2.id_message), R.date FROM membres AS M1, messages AS M2, reponses A' at line 1


    J'ai donc essayer un GROUP BY M2.id_message, cela m'affiche les message en fonction de leur date de création or je souhaiterais que cela m'affiche les messages en fonction de la date de la dernière réponse créer.

    SELECT M1.pseudo, M1.id_membre, M2.titre, M2.id_message, R.date
    FROM membres AS M1, messages AS M2, reponses AS R, liens AS L, liens1 AS L1, liens2 AS L2
    WHERE M1.id_membre = L1.id_membre
    AND M2.id_message = L1.id_message
    AND M2.id_message = L.id_message
    AND L.id_forum = {$forum_id}
    AND M2.id_message = L2.id_message
    AND R.id_reponse = L2.id_reponse
    GROUP BY M2.id_message
    ORDER BY R.date DESC
    


    Merci ! :)
    0