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 :

LEFT JOIN + Sous-requête retourne "NULL"


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut LEFT JOIN + Sous-requête retourne "NULL"
    Hello tout le monde,

    Voilà, afin de récupérer le dernier log d'un utilisateur avec un LEFT JOIN, j'effectue une sous-requête. Le problème, c'est que si l'utilisateur en question n'est pas le dernier utilisateur logué, mysql me retourne NULL.

    Vous n'auriez pas une petite idée?

    Voilà le bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t1.id, t2.date_time 
    FROM t1
       LEFT JOIN t2 
       ON t2.user_id = t1.id 
       AND t2.id = (
          SELECT max(id) 
          FROM t2 
          WHERE user_id = t2.user_id
       ) 
    WHERE t1.user = 'root'
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class certified{
       private $CV;
       public function __construct($CV){
          $this->CV="W3 Excellence";   
       }
       public function certification(){
          echo $this->CV . " Javascript, PHP, CSS, MySQL";
       }
    }
    $wenijah = new certified();

  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
    Plutôt que les abstraits t1 et t2, donne les vraies tables et leur structure.

    Sur le principe et pour autant que je comprenne bien ton besoin et ta requête, chercher le dernier log d'un utilisateur, c'est chercher la date/heure maxi de cet utilisateur.
    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
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Alors, pour la structure, les tables se présentent à peu près comme suit :

    USR_DAT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE `usr_dat` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `hash` varchar(40) NOT NULL,
      `ip` varchar(25) NOT NULL,
      `user` text NOT NULL,
      `name` text NOT NULL,
      `password` varchar(40) NOT NULL,
      `email` varchar(40) NOT NULL,
      PRIMARY KEY (`id`)
    );
    USR_LOG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `usr_log` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `user_id` int(11) unsigned NOT NULL,
      `user_ip` varchar(25) NOT NULL,
      `date_time` datetime NOT NULL,
      PRIMARY KEY (`id`)
    );
    Ensuite, et je te l'accorde, c'est nettement plus simple en affichant le nom réel des tables dans les bout de requêtes :

    REQUETE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT usr_dat.id, usr_log.date_time
    FROM usr_dat
       LEFT JOIN usr_log 
       ON usr_log.user_id = usr_dat.id 
       AND usr_log.id = (
          SELECT max(id) 
          FROM usr_log 
          WHERE user_id = usr_log.user_id 
       )
    WHERE usr_dat.user = 'root'
    Et yes, c'est bien chercher l'heure maxi mais si l'utilisateur n'est pas le dernier logué, c'est pareil pour le date_time, le retour est NULL.

    Merci!
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class certified{
       private $CV;
       public function __construct($CV){
          $this->CV="W3 Excellence";   
       }
       public function certification(){
          echo $this->CV . " Javascript, PHP, CSS, MySQL";
       }
    }
    $wenijah = new certified();

  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
    Quel est le dernier usr_log du usr_dat.name 'root' ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT l.user_id, MAX(l.date_time) AS dernier_log
    FROM usr_log l
    INNER JOIN usr_dat d ON d.id = l.user_id
    WHERE d.name = 'root'
    GROUP BY l.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
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Merci phil, mais je ne peux pas remaniée la structure de la requête (sauf gros boulot sur la requête totale) car récupérer l'heure du log n'est qu'une petite partie de la requête complète.

    En bref, je suis contraint à garder l'ordre de la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
       FROM usr_dat 
       LEFT JOIN * 'suite du code'
    La requête intégrale inclue d'autres jointures basée sur les informations de la table 'usr_dat'...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class certified{
       private $CV;
       public function __construct($CV){
          $this->CV="W3 Excellence";   
       }
       public function certification(){
          echo $this->CV . " Javascript, PHP, CSS, MySQL";
       }
    }
    $wenijah = new certified();

  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
    Ben si tu veux d'autres informations de usr_dat, tu fais une jointure de usr_dat sur ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT -- les colonnes nécessaires et pas étoile !
    FROM usr_dat d1
    LEFT OUTER JOIN
    (
    	SELECT l.user_id, MAX(l.date_time) AS dernier_log
    	FROM usr_log l
    	INNER JOIN usr_dat d ON d.id = l.user_id
    	WHERE d.name = 'root'
    	GROUP BY l.user_id
    ) tmp ON tmp.user_id = d1.id
    Ou alors exprime mieux ton besoin et donne ta requête complète.
    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
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Parfait! Merci phil!!

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class certified{
       private $CV;
       public function __construct($CV){
          $this->CV="W3 Excellence";   
       }
       public function certification(){
          echo $this->CV . " Javascript, PHP, CSS, MySQL";
       }
    }
    $wenijah = new certified();

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

Discussions similaires

  1. Requete avec Left Join sous MySQL 4 et 5
    Par gpers dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/05/2009, 18h04
  2. Sous requête retournant une table
    Par tleboukaka dans le forum Bases de données
    Réponses: 1
    Dernier message: 01/10/2007, 14h16
  3. LEFT JOIN sous Oracle 8i
    Par alexadvance dans le forum Oracle
    Réponses: 11
    Dernier message: 02/11/2005, 11h21

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