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 :

Problème de select imbriqué


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Problème de select imbriqué
    Bonjour à tous ,

    À vrai dire, je suis plutôt novice en sql, ou du moins j'en connais les grandes lignes, mais je suis tombé sur un cas où je dois fournir une requête assez complexe et pour laquelle je suis perdu...

    Pour ce problème, j'ai deux tables (ou du moins deux de mes tables sont utilisées), à savoir T_Clients et T_Reservations, et voici, en "français", ce que devrait donner la requête :

    Sélectionner les réservations dont la date est plus grande que la date d'échéance du client concerné, le tout trié par client.

    J'avais pensé à un truc du genre, en sachant toutefois que c'est incorrect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select *
      from T_Reservations
     where Resa_Date > (select Client_Date_Ech
                          from T_Clients
                         where Client_Id like Resa_Client_Id)
     order by Resa_Client_Id
    sachant que le Resa_Client_Id de la requête imbriquée doit être = à celui de la 1e requête...

    Ai-je été assez clair ? Et y aurait-il quelqu'un qui pourrait m'aider ?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Pour pouvoir émettre un avis sur ta requête, il faudrait déjà qu'on ait une idée de la structure de tes tables !

    L'opérateur LIKE n'a d'intérêt que si on l'utilise avec des caractères génériques pour chercher des chaines correspondant à un modèle.
    Pour comparer deux chaines de caractère, l'opérateur = est bien plus adapté.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Ok pour l'opérateur "=", et sinon sorry, voici pour les structures des tables,
    la table T_Reservations :

    Resa_Id - int(15)
    Resa_Piscine - char(2)
    Resa_Date - date
    Resa_Heure - time
    Resa_Seance_Type - varchar(63)
    Resa_Client_Id - int(11)

    et la table T_Clients :

    Client_Id - int(11)
    Client_Nom - varchar(63)
    Client_Prenom - varchar(63)
    Client_Tel - varchar(23)
    Client_Mail - varchar(63)
    Client_Date_Val - date
    Client_Date_Ech - date
    Client_Mail_Auto - int(5)
    Client_Rest - int(5)
    Client_Pay - int(5)

    ps : merci pour la rapidité et pour les balises "code" de mon 1e post, j'avais oublié

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    Bonjour,

    Une jointure entre les 2 tables devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT r.*
    FROM T_Reservations AS r
    INNER JOIN T_Clients AS c ON r.Resa_Client_Id = c.Client_Id
    WHERE r.Resa_Date > c.Client_Date_Ech
    ORDER BY r.Resa_Client_Id
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Ta requête n'est pas totalement incorrecte et donnerait le bon résultat, mais une simple jointure fonctionne aussi bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT	res.*
    FROM	T_Reservations	res
    	INNER JOIN
    		T_Clients		cli
            ON  res.Resa_Client_Id = cli.Client_Id
    		AND	res.Resa_Date > cli.Client_Date_Ech
    ORDER BY cli.Client_Id
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    A noter qu'avec une jointure interne, les 2 écritures (celle d'al1_24 et la mienne) sont équivalentes. Ce serait différent avec une jointure externe...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Un grand merci à tous, cependant, les alias ne semblent pas pris en compte sous phpMyAdmin (j'ignore si le problème vient de phpMyAdmin ou de MySQL)...

    Voici la requête d'al1_24 (testé avec celle de ced et cela donne la même erreur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    requête SQL: 
     
    SELECT res . *
    FROM T_Reservations res
    INNER JOIN T_Clients cli ON res.Resa_Client_Id = cli.Client_Id
    AND res.Resa_Date > cli.Client_Date_Ech
    ORDER BY cli.Client_Id
    LIMIT 0 , 30
    et le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MySQL a répondu:
     
    #1054 - Unknown column 'cli.Client_Date_Ech' in 'on clause'

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Alors, ça devient compliqué, parce qu'il n'y a pas de raison que ça ne passe pas... il reste plus qu'à tester :

    1) Si tu veux vérifier l'hypothèse phpMyAdmin, essaie avec un autre client ! (Il y a un client natif mysql en ligne de commande je crois, et sinon tu dois pouvoir en trouver d'autres)

    2) Si tu penses que pour une quelconque raison l'alias ne pourrait pas être pris, essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT T_Reservations.*
    FROM T_Reservations 
    INNER JOIN T_Clients ON T_Reservations.Resa_Client_Id = T_Clients.Client_Id
    AND T_Reservations.Resa_Date > T_Clients.Client_Date_Ech
    ORDER BY T_Clients .Client_Id
    LIMIT 0 , 30
    3) J'ose pas trop émettre cette hypothèse, mais tu as peut être fait une faute de frappe dans le nom de la colonne Client_Date_Ech ?
    => Vérifie bien en regardant la description ou en faisant un select * from t_clients

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    Enlève déjà les espaces entre res et * sur la première ligne.
    Ensuite, tu es sûr que la colonne s'écrit bien "Client_Date_Ech" ? Parce que les alias fonctionnent très bien sous MySQL (quelle est ta version ?), et le problème ressemble plus à une erreur dans le nom de la colonne que dans l'alias.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bon.. autant pour moi.. là je vais vraiment passer pour une bille.. mais soyons honnête..

    Effectivement pour toutes mes dates j'ai écrit Date sauf pour Client_Date_Ech où j'ai en fait appelé ce champ Client_Dat_Ech, allez savoir pourquoi

    Bref mille mercis à tous

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Citation Envoyé par opus32 Voir le message
    Bon.. autant pour moi.. là je vais vraiment passer pour une bille..
    ça nous arrive tous à un moment ou à un autre
    Tant qu'on ne détruit pas les données ...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 04h04
  2. problème select imbriquées select(select--
    Par young077 dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/10/2011, 15h29
  3. Problème avec Select imbriqué nom fichier variable
    Par gb1963 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/08/2011, 15h47
  4. Problème requete avec SELECT imbriqué
    Par Isiker dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2010, 17h44
  5. SYBASE SELECT imbriqué clause FROM
    Par Nicolas Martel dans le forum Sybase
    Réponses: 2
    Dernier message: 19/11/2003, 16h28

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