IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête portant sur 2 tables simultanément : comment faire ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Points : 57
    Points
    57
    Par défaut Requête portant sur 2 tables simultanément : comment faire ?
    Bonjour,

    (toujours dans mon petit développement de la Boite à rêves...)

    J'ai une table reves qui contient les rêves : id, pseudo, reve, date, etc.
    J'ai une table reves_comments qui contient les commentaires associés aux rêves : id, id_reve, pseudo, comment, etc.

    La table reves a un champ "activity" qui prend soit la valeur on si les rêves sont publiés soit la valeur off si les rêves sont offline parce qu'ils n'ont pas encore été validé ou parce qu'ils ont été mis offline momentanément/définitivement après avoir été online un temps.

    La table reves_comments contient un champ "activity" similaire : on pour les commentaires online et off pour les offline...

    (Edit) Je souhaite afficher les titres des rêves des 10 derniers commentaires postés qui sont "on" et dont le rêve associé est "on" aussi et les pseudos des auteurs des commentaires. Je cherche à obtenir : l'id du rêve, le titre du rêve, l'id du commentaire.
    Je ne sais pas comment faire ma requête à la BDD (MySQL) :s. Pourriez-vous m'aider à faire cette requête svp ?

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour,

    on entre dans le domaine de gestion de table et de requêtes de jointures.
    la requête devra donc te sortir les 10 derniers éléments qui vérifieront
    le reve est "on"
    le commentaire est "on"
    le commentaire se rattache au rêve

    donc, il y aura trois conditions, les 2 conditions "on" et la condition d'égalité
    reves.id = reves_comments.id_reve (c'est la requête de jointure entre les 2 tables)

    et une petite chose, le champ pseudo de la table rêve est superflu puisque chque commentaire est rattaché à un seul rêve et chaque rêve à un seul pseudo => info redondante.

  3. #3
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Dejà dans tes 2 tables, il y a des informations redondantes(id, pseudo), c'est pas top...

    Quant à la requete, pour obtenir les 10 derniers commentaires

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT comment 
    FROM reves_comment RC, reves R
    WHERE R.id_reve = RC.id_reve
    AND R.activity <> "off"
    AND RC.activity <> "off"
    ORDER BY RC.date DESC
    LIMIT 0,10
    Il te faut un champ date dans ta table reves_comment, surement qu'il y ait deja!
    Le order by DESC trie les dates des commentaires par ordre decroissant
    Ensuite tu recupères les 10 premiers (LIMIT)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par khayyam90
    et une petite chose, le champ pseudo de la table rêve est superflu puisque chque commentaire est rattaché à un seul rêve et chaque rêve à un seul pseudo => info redondante.
    Je ne comprends pas pourquoi vous dîtes que j'ai des infos redondantes :- ?
    Dans ma table "reves" j'ai le pseudo de l'auteur du rêve.
    Dans ma table "reves_comments" j'ai le pseudo de l'auteur du commentaire. Et il y a plusieurs commentaires par rêve, donc plusieurs pseudos de commentateurs, cela pour un même rêve, ce dernier ayant un auteur au pseudo indépendant de ceux des commentateurs.
    Non :- ?

    Pour l'id :
    Dans ma table "reves" j'ai l'id du rêve (champ "id"). Normal.
    Dans ma table "reves_comments" j'ai l'id du commentaire (champ "id"). J'ai également l'id du rêve commenté (champ "id_reve"). Ce dernier permettant d'afficher les commentaires associés au rêve en dessous du rêve en question (SELECT ... WHERE id_reve=$id ORDER BY id ASC).

    Linaa > Mui mais je cherche à afficher les titres des derniers commentaires et leurs pseudos, pas les commentaires eux même en fait. Désolé je n'ai pas précisé, je me suis mal exprimé . (je corrige mon premier message pour que ce soit plus clair). C'est là ma difficulté :
    - obtenir le titre et l'id des rêves des 10 derniers commentaires qui sont "on" et dont le reve correspondant est "on" également.
    - obtenir l'id des 10 derniers commentaires obtenus (ça me servira uniquement à faire un lien de type # pour placer le lecteur directement sur le commentaire en question).

  5. #5
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par yazerty
    Citation Envoyé par khayyam90
    et une petite chose, le champ pseudo de la table rêve est superflu puisque chque commentaire est rattaché à un seul rêve et chaque rêve à un seul pseudo => info redondante.
    Je ne comprends pas pourquoi vous dîtes que j'ai des infos redondantes :- ?
    j'étais parti sur le pseudo du rêveur et non du commentateur. Comme ce sont pas les pseudos des mêmes personnes, c'est ok.

    Citation Envoyé par yazerty
    - obtenir le titre et l'id des rêves des 10 derniers commentaires qui sont "on" et dont le reve correspondant est "on" également.
    il suffit de changer le nom des champs à sélectionner dans la requête proposée par Linaa commentaires.titre, commentaires.id

  6. #6
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Citation Envoyé par yazerty
    Linaa > Mui mais je cherche à afficher les titres des derniers commentaires, pas les commentaires eux même en fait. Désolé je n'ai pas précisé, je me suis mal exprimé . (je corrige mon premier message pour que ce soit plus clair). C'est là ma difficulté :
    - obtenir le titre et l'id des rêves des 10 derniers commentaires qui sont "on" et dont le reve correspondant est "on" également.
    - obtenir l'id des 10 derniers commentaires obtenus (ça me servira uniquement à faire un lien de type # pour placer le lecteur directement sur le commentaire en question).
    Dans ce cas, fait un SELECT R.titre, R.id_reve, R.id

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    J'ai essayé de modifié la requête de Linaa comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = "SELECT r.titre, r.id, rc.id, rc.pseudo FROM reves r, reves_comments rc WHERE r.id = rc.id_reve AND r.activity='on' AND rc.activity='on' LIMIT 0,10";
    $req = mysql_query($sql);
    echo "<ul>";
    while($data = mysql_fetch_assoc($req))
        {
    	// Affichage
    	echo "test ok";
        }
    echo "</ul>";
    Mais ça me sort une moche erreur :

    mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
    Et après je ne sais pas comment récupérer les données avec cette méthode r/rc (ça s'appelle comment cette méthode d'ailleurs ? que je me documente sur le sujet ). Avec un $data['titre'] ? Mais je vais pas me retrouver embêter pour les id du rêve et du commentaire (même nom de champ même si ça ne correspond pas à la même chose) ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Linaa
    SELECT R.titre, R.id_reve, R.id
    Nop .

    Et ça ne marche pas non plus avec :
    SELECT r.titre, rc.id, rc.id_reve, rc.pseudo FROM reves r, reves_comments rc WHERE r.id = rc.id_reve AND r.activity='on' AND rc.activity='on' LIMIT 0,10

    (l'erreur mysql_fetch_assoc() dans les 2 cas...)

  9. #9
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = mysql_query($sql) or die (mysql_error());


    Et dans ta requete r.activity="on"

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    mmm, désolé je n'ai pas encore ce bon réflexe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = "SELECT R.titre, RC.id_reve, RC.id FROM reves R, reves_comments RC WHERE R.id = RC.id_reve AND R.activity='on' AND RC.activity='on' LIMIT 0,10";
    $req = mysql_query($sql) or die (mysql_error());
    donne l'erreur suivante :
    Unknown column 'R.activity' in 'where clause'
    Sinon en remplaçant les ' ' par des " " ça fait une parse error.

  11. #11
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Pour le parse error, il faut déspécifier les " en ajoutant des \

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT R.titre, RC.id_reve, RC.id FROM reves R, reves_comments RC WHERE R.id = RC.id_reve AND R.activity=\"on\" AND RC.activity=\"on\" LIMIT 0,10";
    Traduction du message : il n'y a pas de colonne activity dans ta table reves !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Ca marche nickel maintenant . Merci beaucoup Linaa !

  13. #13
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Penses au

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/07/2012, 14h52
  2. [WD16] Faire une requête SQL sur une table ?
    Par EriCstoFF dans le forum WinDev
    Réponses: 9
    Dernier message: 01/09/2011, 10h16
  3. [MySQL] Requête portant sur 5 tables
    Par razorlok dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/06/2008, 10h53
  4. Requête portant sur deux tables et deux champs
    Par OliviaS dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/05/2008, 19h37
  5. Réponses: 1
    Dernier message: 28/03/2007, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo