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 SQL Discussion :

Utilisation de valeur dans une sous-requête


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 739
    Points : 643
    Points
    643
    Par défaut Utilisation de valeur dans une sous-requête
    Bonjour et bonne année 2002 a ceux qui me lise !

    J'ai un petit soucis pour pose une requête SQL (sous MySQL) :
    je dispose de logs dans une table pour une web app avec des valeurs de login / diverses infos + en parallèle une table avec des lignes créés par les users

    J’aimerais, dans la même requête, récupérer le nom de l'utilisateur avec la date de son dernier login : ici assez simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Logs_User,max(`Logs_Date`) from logs GROUP BY `Logs_User` ORDER BY Logs_User
    mais il me faudrait d'autres infos qui me viennent d'une autre table , j'ai tenté un : comme ci-dessous, "WHERE Objet_Cree LIKE Login" , dans Login je voudrais l'info du nom d'utilisateur récupéré dans le "SELECT Logs_Users AS Login"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Logs_User AS Login,max(`Logs_Date`), (SELECT Count(*) AS Nbre_Test FROM objets WHERE Objet_Cree LIKE Login)  from logs GROUP BY `Logs_User` ORDER BY Logs_User"
    Je ne sais pas si j'ai été clair dans mes explications ... une idée de comment récupérer l'info du login dans ma sous-requête ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 319
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,
    Si tu mets la sous-requête dans le FROM, ça devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Logs_User AS Login,max(`Logs_Date`),x.nbr_test from logs 
    inner join (SELECT Objet_Cree,Count(*) AS Nbre_Test FROM objets WHERE Objet_Cree = Login)  as x on s.Objet_Cree = logs.Login
    GROUP BY `Logs_User` ,x.nbr_test
    ORDER BY Logs_User"
    J'ai remplacé le LIKE par un test d'égalité car je pense que le LIKE ne fonctionnera pas ici (mais à tester quand même).

    Tu peux aussi utiliser une CTE si ta version de MySQL le permet.

    Tatayo

  3. #3
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 739
    Points : 643
    Points
    643
    Par défaut
    Bonjour, un grand merci pur ta réponse

    Je me suis basé sur ton code pour monter ma requête SQL , voila ce que cela donne avec les champs réels :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Logs_User AS Login,max(`Logs_Date`), x.Nbre_Jeux  from logs 
    INNER JOIN (SELECT Jeux_Usercree,COUNT(*) AS Nbre_Jeux FROM jeux WHERE Jeux_Usercree = Login) AS x ON  s.Jeux_Usercree = logs.Login
    GROUP BY Logs_User, x.Nbre_Jeux
    ORDER BY Logs_User
    mais ... j'ai toujours cette erreur :

    SQLSTATE[42S22]: Column not found: 1054 Champ 'Login' inconnu dans where clause !

    J'ai tenté avec le remplacement de Login par le nom de la colonne Logs_User, sans plus de succès ... je ne comprends pas ce qui ne passe pas ou que je fais faux ...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 126
    Points : 28 532
    Points
    28 532
    Par défaut
    Bonjour,

    Un alias de colonne n'est visible que depuis les clauses GROUP BY et ORDER BY.
    Par ailleurs, la colonne logs.Login n'existe sans doute pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  lgs.Logs_User AS Login
        ,   MAX(lgs.Logs_Date)
        ,   cnt.Nbre_Jeux  
    FROM    logs    AS  lgs   
    INNER JOIN 
        (   SELECT  Jeux_Usercree
                ,   COUNT(*)        AS Nbre_Jeux 
            FROM    jeux 
            WHERE   Jeux_Usercree = lgs.Logs_User
        )   AS  cnt
        ON  cnt.Jeux_Usercree = lgs.Logs_User
    GROUP BY Login
        ,   cnt.Nbre_Jeux
    ORDER BY Login

  5. #5
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 739
    Points : 643
    Points
    643
    Par défaut
    pff ... m'en sort pas ... ça m'avait pas semblé si compliqué ...

    J'ai modifié ma requête selon les indications, mais j'ai toujours la même erreur, même en mettant le code en dur dans phpMyAdmin pour test :

    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
     
     
    SELECT  lgs.Logs_User AS Login
        ,   MAX(lgs.Logs_Date)
        ,   cnt.Nbre_Jeux  
    FROM    logs    AS  lgs   
    INNER JOIN 
        (   SELECT  Jeux_Usercree
                ,   COUNT(*)        AS Nbre_Jeux 
            FROM    jeux 
            WHERE   Jeux_Usercree = lgs.Logs_User
        )   AS  cnt
        ON  cnt.Jeux_Usercree = lgs.Logs_User
    GROUP BY Login
        ,   cnt.Nbre_Jeux
    ORDER BY Login
    MySQL a répondu : Documentation
    #1054 - Champ 'lgs.Logs_User' inconnu dans where clause

    je retourne la requête dans tous les sens, mais j'arrive toujours au même résultat : champ inconnu.

    Je ne vois pas ce que je fais de faux ?

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 126
    Points : 28 532
    Points
    28 532
    Par défaut
    C'est la ligne 11 qui n'a pas de raison d'être.
    La restriction sur Jeux_Usercree = lgs.Logs_User est effectuée au niveau de la condition de jointure, à la ligne 13.

    Dans une table dérivée (= sous-requête utilisée dans la clause FROM) les colonnes des autres tables de la requête ne sont pas visibles.

  7. #7
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 739
    Points : 643
    Points
    643
    Par défaut
    oui , mais si je la retire, je me retrouve avec uniquement un utilisateur retourné avec la somme des lignes de la table "jeux" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    array (size=1)
      0 => 
        array (size=3)
          'Login' => string 'TOTO' (length=8)
          'max(lgs.Logs_Date)' => string '2019-10-09 05:11:31' (length=19)
          'Nbre_Jeux' => string '4866' (length=4)
    Alors qu'il me faudrait la liste des utilisateurs, avec la date de leur dernier login et je nombre de fiche de jeux qu'il a créé, il me semble que la condition sur le login est nécessaire dans la sous-requête.
    Ce serait un problème de visibilité entre les couches de la requête ?

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 126
    Points : 28 532
    Points
    28 532
    Par défaut
    Encore cette @#!%µ de MySQL qui retourne des résultats inconsistants sur des requêtes qui ne respectent pas la syntaxe et auraient dû se terminer en erreur.
    Il manque un GROUP BY Jeux_Usercree dans la sous-requête.

  9. #9
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 739
    Points : 643
    Points
    643
    Par défaut
    J'y suis enfin arrivé !

    ... et je n'y serait pas arrivé sans toi ... un très grand MERCI pour ton aide !


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

Discussions similaires

  1. Transfert de valeur dans une sous-requête
    Par Guillaume418 dans le forum Access
    Réponses: 3
    Dernier message: 23/11/2020, 18h55
  2. Utilisation de Having dans une sous-requête
    Par ultimus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/05/2014, 00h01
  3. Utiliser une liste de valeurs dans une sous-requête
    Par sagopa dans le forum Requêtes
    Réponses: 12
    Dernier message: 30/04/2012, 12h08
  4. Utilisation de colonnes dans une sous-requête
    Par boubacach dans le forum SQL
    Réponses: 5
    Dernier message: 31/05/2010, 11h55
  5. impossible d'utiliser LIMIT 1 dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 13
    Dernier message: 19/12/2009, 23h42

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