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

Langage PHP Discussion :

Jointure et problème de sélection avec le WHERE


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut Jointure et problème de sélection avec le WHERE
    Bonjour,

    J'ai une table qui comporte des messages, chaque enregistrements à un id expéditeur ainsi qu'un id destinataire.

    Dans la table il peut donc y avoir plusieurs messages qui comporte le même expéditeur et le même destinataire si par exemple le membre 1 envoie 3 messages au membre 2 alors il y aura :
    id_expediteur / id_destinataire
    1 / 2
    1 / 2
    1 / 2
    donc 3 messages.

    le problème c'est que je suis en train de faire une boite de réception avec la liste des correspondants mais actuellement ma requête affiche justement l'ensemble des messages! je veux que ma requête "regroupe" les même id destinataire et expéditeur et affiche le pseudo du correspondant via une jointure. Je ne sais pas si j'ai été précis dans mon histoire ?

    voici une image de mes enregistrements de ma table messages
    Nom : phpmyadmin.jpg
Affichages : 127
Taille : 98,0 Ko

    maintenant disons que je suis le membre avec l'id 1 (pseudo demo)
    la photo affiche actuellement :
    Nom : affichage.jpg
Affichages : 135
Taille : 15,3 Ko

    Alors que j'attends un affichage de seulement 2 lignes car dans la photo phpmyadmin le membre 1 parle avec seulement 2 membres et pas 5 ! voila mon problème. Pas évident pour l'expliquer, je vous remercie pour votre aide je pense qu'il faut modifier le where mais je ne sais pas comment :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $user_id = $_SESSION['auth']->id;
     
    	$reponse = $pdo->prepare("SELECT
    	u.id id_correspondant,
    	u.username pseudo_correspondant,
    	m.id id_msg,
    	m.id_expediteur id_exp,
    	m.id_destinataire id_des,
    	m.date_envoi date_msg
    FROM users u
    INNER JOIN messages m
    ON m.id_expediteur = u.id
    WHERE m.id_expediteur = $user_id OR m.id_destinataire = $user_id
    ORDER BY m.date_envoi DESC
    LIMIT 0, 20");

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ne met pas le detail des messages dans la requête puisque tu veux seulement les expediteurs/destinataires.
    Il n'y a pas besoin d'une requête préparée puisque tu n'as pas de paramètres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $reponse = $pdo->query("SELECT
    	DISTINCT u.id id_correspondant,
    	u.username pseudo_correspondant
    FROM users u
    INNER JOIN messages m ON m.id_expediteur = u.id
    WHERE m.id_expediteur = $user_id OR m.id_destinataire = $user_id
    ORDER BY m.date_envoi DESC
    LIMIT 0, 20");
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    ah je ne connaissais pas le SELECT DISTINCT

    merci infiniment

    sinon, je t’embête encore

    Si je suis le membre demo (id 1) je voudrais que la requête affiche le pseudo de mon interlocuteur et non le mien, actuellement dans la deuxieme ligne la requete affiche "demo" alors que demo c'est moi

    _________
    Boîte de réception
    Pseudo : test (Consulter la conversation)
    Pseudo : demo (Consulter la conversation)
    _________

    Il faudrait que la requête affiche le pseudo "encoreuntest" c'est le pseudo du membre qui porte l'id 3..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
     
    // Connexion à la base de données
    require_once 'inc/db.php';
    $user_id = $_SESSION['auth']->id;
     
    $reponse = $pdo->query("SELECT DISTINCT
    	u.id id_correspondant,
    	u.username pseudo_correspondant
    FROM users u
    INNER JOIN messages m ON m.id_expediteur = u.id
    WHERE m.id_expediteur = $user_id OR m.id_destinataire = $user_id
    ORDER BY m.date_envoi DESC
    LIMIT 0, 20");
     
    while ($donnees = $reponse->fetch())
    {
    ?>
     
    Pseudo : <?php echo htmlspecialchars($donnees->pseudo_correspondant); ?> <a href="messages.php?idmbr=<?php echo $donnees->id_correspondant ?>">(Consulter la conversation)</a>
    <br>
     
    <?php
    }
    $reponse->closeCursor();
     
    ?>

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Une possibilité :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT
    	IF (m.id_expediteur = $user_id, m.id_destinataire, m.id_expediteur) id,
            IF (m.id_expediteur = $user_id, u2.username, u1.username) pseudo
    FROM messages m
    JOIN users u1 ON m.id_expediteur = u1.id
    JOIN users u2 ON m.id_destinataire = u2.id
    WHERE m.id_expediteur = $user_id OR m.id_destinataire = $user_id
    ORDER BY m.date_envoi DESC
    LIMIT 0, 20
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    Ton code fonctionne parfaitement bien (sujet résolu grâce à toi) ! Je te remercie et je vais essayer de le décortiquer pour mon apprentissage

    sinon dans ton message tu dis "une possibilité" ?

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    A un moment j'avai pensé faire une union plutôt qu'une jointure et des conditions ... je ne sais pas lequel est le plus efficace, il faudrait mesurer.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT id, username, date_envoi
    FROM (
             SELECT u1.id, u1.username, m1.date_envoi
             FROM messages m1 JOIN users u1 ON m1.id_expediteur = u1.id
             WHERE m1.id_destinataire = $user_id 
     
             UNION
     
             SELECT u2.id, u2.username, m2.date_envoi
             FROM messages m2 JOIN users u2 ON m2.id_destinataire = u2.id
             WHERE m2.id_expediteur = $user_id 
    )
    ORDER BY date_envoi DESC
    LIMIT 0, 20
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

Discussions similaires

  1. Problème requête sélection avec SQLite
    Par janyoura dans le forum Android
    Réponses: 8
    Dernier message: 12/12/2012, 23h04
  2. [XQUERY] Problème sum éléments avec clause where
    Par OLman135 dans le forum XQUERY/SGBD
    Réponses: 2
    Dernier message: 21/05/2012, 11h17
  3. [HQL] probléme requete HQL avec clause where in
    Par titawine dans le forum Hibernate
    Réponses: 3
    Dernier message: 16/05/2012, 10h02
  4. problème de sélection avec les champs vides
    Par danathane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/08/2007, 16h45
  5. Problème de sélection avec LIKE
    Par Mr. Smith dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/08/2006, 19h37

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