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

Requêtes MySQL Discussion :

Une requête en JOINTURE qui renvoi plusieurs arrays


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 50
    Points : 34
    Points
    34
    Par défaut Une requête en JOINTURE qui renvoi plusieurs arrays
    Bonjour,

    A l'heure actuel, je bloque sur un problème de jointure. J'ai essayer de regarder toutes les docs possible des jointures en SQL, mais pas moyen de réussir ...


    J'essaye de construire une requête en jointure qui récupèrerais (dans la jointure) plusieurs résultats SQL... Quelqu'un pourrait m'éclairer ? Me donner un peu d'indications ^^ !!


    Plus explicitement :

    J'ai 3 tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TABLE: online_users
    user_id
    timestamp
     
    TABLE: users
    user_id
    user_login
     
    TABLE: friends
    user_id
    user_friend_id
    user_friend_name
    J'aimerais, en UNE requête récupéré la liste des membres en ligne (ayant un timestamp de 120sec de différence), en suite faire un inner join sur chacune pour récupéré le login du membre, puis en suite récupéré sa liste d'amis (qui dispose de plusieurs résultats pour chaque users)..

    J'arrive pas à faire retourné un tableau de résultats par mysql pour ma liste d'amis etc.. ;(

    En gros j'aimerais que sa me renvoi quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {userid, pseudo { Amis: [userid, pseudo][userid,pseudo][userid,pseudo] }}
    Merci de votre lecture !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quelle requête SQL as-tu dans ton programme pour commencer ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Tout d'abors, merci de ta réponse et de ta lecture !!

    J'ai essayer une multitude de requete possible (avec right, left, full, outer etc)..

    Exemple d'une requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT users.user_login, friends.user_friend_name FROM online_users as o
    	 JOIN users as users ON users.user_id = o.user_id
    	 JOIN friends as friends ON friends.user_id = user.user_id
    Le mieu que j'ai pu recevoir, c'est une liste avec multi doublons sur les users (par example, une ligne par résultats de chaque amis). Je sais que je peut utiliser un group by mais j'aimerais plusieurs tableaux dans mes résultats si c'est possible.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Plusieurs remarques...
    1) Il y a une erreur dans ta requête : La table 'user' donnée dans la seconde condition de jointure n'existe pas ; c'est 'users'.

    2) Ensuite, le "meilleur" résultat que tu as obtenu me semble normal !
    Le mieu que j'ai pu recevoir, c'est une liste avec multi doublons sur les users (par example, une ligne par résultats de chaque amis).
    Comme un membre de online_users peut avoir plusieurs amis, c'est normal qu'il ait autant de lignes que d'amis dans le résultat retrouné par la requête.

    C'est au programme qui interroge la BDD de mettre en forme le résultat, pas au SGBD.

    3) D'après ton premier message, tu veux :
    la liste des membres en ligne (ayant un timestamp de 120sec de différence)
    Quoique je ne comprenne pas ce que veux dire "un timestamp de 120sec de différence" (de différence avec quoi ?), je ne vois pas dans ta requête de condition sur le timestamp (qui au passage est un mot réservé du langage SQL et ne devrait pas être donné comme nom à une table ! ).

    4) Mettre un alias à une table qui reprend le nom de la table ne sert strictement à rien !

    5) JOIN = INNER JOIN
    Si un user n'a pas d'ami, il n'apparaîtra pas dans le résultat, même s'il est online !
    Tu devrais utiliser LEFT OUTER JOIN dans la seconde jointure.

    Sinon ta requête donne bien la liste des amis des utilisateurs présents dans la table online_users.

    La voici réécrite avec une meilleure utilisation des alias et une mise en forme plus facile à lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT u.user_login, f.user_friend_name 
    FROM online_users AS o
    JOIN users AS u ON u.user_id = o.user_id
      JOIN friends AS f ON f.user_id = u.user_id
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup !!!

    Par contre j'ai quelques questions !

    En terme de "performances", c'est la meilleur solution ?

    Car si jamais j'ai 500 utilisateurs en ligne, qui dispose de ~50 amis, sa ferais un retour de 25000 résultats, donc un gros temps d'execution je supose !?


    Puis pour mettre en forme cela comme je le souhaite (array qui regroupe la liste des users, puis une autre array imbriqué avec sa budydlist), il y existe une méthode "simple" en PHP?

    Merci infiniment pour le temps accordé !

    Cordialement

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ca m'étonnerais quand même que tu aies besoin d'afficher 25000 résultats d'un coup non ?

    Ne s'agit-il pas d'afficher, à la demande d'un utilisateur, une liste d'amis d'un membre sur lequel il a cliqué ou un truc dans le genre ?

    Ceci dit, 25000 lignes pour un SGBD ce n'est rien ! Ca se traite en largement moins d'une seconde.

    Et 25000 lignes à traiter pour PHP, ce n'est pas beaucoup plus long !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    D'accord

    Merci pour l'éclaircissement.

    Sinon, une idée simple pour traiter ces lignes sur la manière que je souhaite (en double array) ?

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ton programme sera bien en PHP ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/08/2013, 15h12
  2. Une fonction qui renvoie plusieurs valeurs ?
    Par chuckichucki dans le forum Langage
    Réponses: 9
    Dernier message: 14/01/2011, 13h49
  3. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 02h13
  4. Une fonction qui renvoie un array
    Par Tangui dans le forum Débuter
    Réponses: 1
    Dernier message: 02/12/2007, 00h53
  5. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07

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