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 :

impossible d'utiliser LIMIT 1 dans une sous-requête


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut impossible d'utiliser LIMIT 1 dans une sous-requête
    Bonjour,

    j'ai 3 tables

    client : client_cleunik
    commandes : commande_cleunik,date_commande
    relations : client_cleunik,commande_cleunik,interlocuteur_cleunik

    je voudrais avoir pour chaque client uniquement la dernière commande (sur date) et je suis infoutu de trouver la bonne syntaxe, sachant qu'a priori, je ne peux pas utiliser limit dans une sous requête.

    une âme charitable pour me donner une piste ?

    D'avance, merci pour vos lumières.
    Cordialement,
    Christophe Charron

  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
    Une piste :
    La dernière commande de chaque client, c'est celle qui a la date max pour chaque client.
    Un coup de MAX quelque part, un coup de GROUP BY autre part et tu devrais y arriver.

    Tu nous donne un début de requête pour qu'on puisse t'aider sans te donner la solution toute faite qui ne t'apprendrait peut-être pas grand chose ?
    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 confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Merci pour la prompte réponse.

    Ce que j'essaie mais qui ne fonctionne pas :
    #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select f4.commande_cleunik from relations f5 left join client f4 using (client_cleunik) where f4.commande_cleunik in (
    select f2.commande_cleunik from relations f1 left join commandes f2 using(commande_cleunik) left join client f3 on f1.client_cleunik=f3.client_cleunik where f1.client_cleunik=f5.client_cleunik order by f2.date_commande desc limit 1
    )
    sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select f2.commande_cleunik from relations f1 left join commandes f2 using(commande_cleunik) left join client f3 on f1.client_cleunik=f3.client_cleunik where f1.client_cleunik=1 order by f2.date_commande desc limit 1
    me renvoit bien la dernière commande du client 1
    Cordialement,
    Christophe Charron

  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
    MAX et GROUP BY... apparemment, tu n'as pas cherché et ça ne te dit rien ?

    Le principe :
    Je regroupe (GROUP BY) par client_cleunik et je sélectionne (SELECT) la MAX(date_commande) pour chaque client_cleunik

    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cl.client_cleunik, MAX(cd.date_commande) AS Date_dern_cmd
    FROM commandes AS cd
    INNER JOIN relations AS r ON cd.commande_cleunik = r.commande_cleunik
      INNER JOIN client AS cl ON r.client_cleunik = cl.client_cleunik
    GROUP BY cl.client_cleunik
    Au fait, elle sert à quoi la table relations ?
    Une commande peut concerner plusieurs clients ?
    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 confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    MAX et GROUP BY... apparemment, tu n'as pas cherché et ça ne te dit rien ?

    Le principe :
    Je regroupe (GROUP BY) par client_cleunik et je sélectionne (SELECT) la MAX(date_commande) pour chaque client_cleunik
    J'ai bien compris cela.

    Je ne cherche pas la date maximum des commandes de chaque client, je cherche la commande_cleunik correspondant à la dernière commande (en effet celle qui correspond au max)
    Citation Envoyé par CinePhil Voir le message
    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cl.client_cleunik, MAX(cd.date_commande) AS Date_dern_cmd
    FROM commandes AS cd
    INNER JOIN relations AS r ON cd.commande_cleunik = r.commande_cleunik
      INNER JOIN client AS cl ON r.client_cleunik = cl.client_cleunik
    GROUP BY cl.client_cleunik
    Au fait, elle sert à quoi la table relations ?
    Une commande peut concerner plusieurs clients ?
    Oui, une commande peut concerner plusieurs clients ( ce sont des commandes fournisseur)
    Cordialement,
    Christophe Charron

  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
    Citation Envoyé par Christophe Charron Voir le message
    Je ne cherche pas la date maximum des commandes de chaque client, je cherche la commande_cleunik correspondant à la dernière commande (en effet celle qui correspond au max)
    Et bien il suffit de joindre la première requête que j'ai donnée à la table des relations pour avoir la commande_cleunik qui correspond à la date max de chaque client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT tmp.client_cleunik, r1.commande_cleunik, tmp.Date_dern_cmd
    FROM relations AS r1
    INNER JOIN (
      SELECT cl.client_cleunik, MAX(cd.date_commande) AS Date_dern_cmd
      FROM commandes AS cd
      INNER JOIN relations AS r ON cd.commande_cleunik = r.commande_cleunik
        INNER JOIN client AS cl ON r.client_cleunik = cl.client_cleunik
      GROUP BY cl.client_cleunik
    ) AS tmp ON r1.client_cleunik = tmp.client_cleunik
    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 confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Encore merci pour la précieuse aide apportée.

    Mais non, il ne suffit pas ...

    130000045 130000257 19/11/09 19:01
    130000045 130000358 19/11/09 19:01
    130000045 130000365 19/11/09 19:01
    130000046 130000256 19/11/09 18:42
    130000046 130000357 19/11/09 18:42
    130000047 130000255 19/11/09 18:38
    130000047 130000356 19/11/09 18:38
    130000048 130000254 09/11/09 17:00
    130000048 130000275 09/11/09 17:00
    130000049 130000253 19/11/09 18:36
    130000049 130000355 19/11/09 18:36
    130000050 130000252 09/11/09 11:42
    130000051 130000251 19/11/09 18:32
    130000051 130000354 19/11/09 18:32
    130000052 130000250 19/11/09 18:30
    130000052 130000353 19/11/09 18:30
    130000053 130000249 09/11/09 11:40
    130000054 130000248 03/05/10 15:48
    130000054 130000273 03/05/10 15:48
    130000054 130000274 03/05/10 15:48
    130000056 130000272 09/11/09 15:04
    Je ne récupère pas uniquement la dernière commande du client.
    Est-ce parce que je peux trouver le client plusieurs fois dans la table relations? Il y est autant de fois, pour une commande donnée, qu'il y a de correspondant intéressés à la commande)
    Cordialement,
    Christophe Charron

  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
    Ajoute DISTINCT après SELECT.
    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 !

  9. #9
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ajoute DISTINCT après SELECT.
    Cela ne change rien (tenté le distinct dans le select principal et dans la sous requête)
    Cordialement,
    Christophe Charron

  10. #10
    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
    Citation Envoyé par Christophe Charron Voir le message
    Cela ne change rien (tenté le distinct dans le select principal et dans la sous requête)
    Effectivement, j'ai répondu un peu vite en voyant que pour chaque client, la date était répétée.
    Mais le résultat est logique !
    Comment fais-tu pour distinguer quelle est la dernière commande pour un client si plusieurs sont émises à la même minute ?

    130000045 130000257 19/11/09 19:01
    130000045 130000358 19/11/09 19:01
    130000045 130000365 19/11/09 19:01

    130000046 130000256 19/11/09 18:42
    130000046 130000357 19/11/09 18:42

    130000047 130000255 19/11/09 18:38
    130000047 130000356 19/11/09 18:38

    130000048 130000254 09/11/09 17:00
    130000048 130000275 09/11/09 17:00

    130000049 130000253 19/11/09 18:36
    130000049 130000355 19/11/09 18:36

    130000050 130000252 09/11/09 11:42
    130000051 130000251 19/11/09 18:32
    130000051 130000354 19/11/09 18:32

    130000052 130000250 19/11/09 18:30
    130000052 130000353 19/11/09 18:30

    130000053 130000249 09/11/09 11:40
    130000054 130000248 03/05/10 15:48
    130000054 130000273 03/05/10 15:48
    130000054 130000274 03/05/10 15:48

    130000056 130000272 09/11/09 15:04
    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 !

  11. #11
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Effectivement, j'ai répondu un peu vite en voyant que pour chaque client, la date était répétée.
    Mais le résultat est logique !
    Comment fais-tu pour distinguer quelle est la dernière commande pour un client si plusieurs sont émises à la même minute ?
    c'est à cela que servait le limit 1
    Et si je rajoutait un order by commande_cleunik

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT f2.commande_cleunik FROM relations f1 LEFT JOIN commandes f2 USING(commande_cleunik) LEFT JOIN client f3 ON f1.client_cleunik=f3.client_cleunik WHERE f1.client_cleunik=1 ORDER BY f2.date_commande DESC  f2.commande_cleunik DESC LIMIT 1
    je devais pouvoir m'en sortir ?
    Cordialement,
    Christophe Charron

  12. #12
    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
    Faudrait savoir ce que tu veux :
    je cherche la commande_cleunik correspondant à la dernière commande (en effet celle qui correspond au max)
    Sauf que d'après tes données, il peut y avoir plusieurs commandes répondant au critère de dernière commande (dernère date, heure, minute) pour un client.
    Selon cette logique de date, rien ne permet de distinguer ces commandes.

    Si tu veux la cle_unik max de chaque client, il faut refaire un GROUP BY.
    Comme on n'a qu'une date par client, on peut grouper, conformément à la norme, sur le client et la date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT tmp.client_cleunik, 
      MAX(r1.commande_cleunik) AS dern_cleunik_commande, 
      tmp.Date_dern_cmd
    FROM relations AS r1
    INNER JOIN (
      SELECT cl.client_cleunik, MAX(cd.date_commande) AS Date_dern_cmd
      FROM commandes AS cd
      INNER JOIN relations AS r ON cd.commande_cleunik = r.commande_cleunik
        INNER JOIN client AS cl ON r.client_cleunik = cl.client_cleunik
      GROUP BY cl.client_cleunik
    ) AS tmp ON r1.client_cleunik = tmp.client_cleunik
    GROUP BY tmp.client_cleunik, tmp.Date_dern_cmd
    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 !

  13. #13
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut

    mais c'est que cela a l'air d'être bon !!!
    j'essaie de faire rapidement une vérification fine et je te tiens au courant.
    Je n'ai pas du tout l'habitude de faire des join sur des requêtes ... je vais étudier cela de très près.

    Merci beaucoup pour ta patience et ta pédagogie.
    Cordialement,
    Christophe Charron

  14. #14
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Bonsoir,

    et encore un grand merci. La requête renvoie tout à fait le résultat escompté.
    Cordialement,
    Christophe Charron

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

Discussions similaires

  1. Utilisation de Having dans une sous-requête
    Par ultimus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/05/2014, 23h01
  2. 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, 11h08
  3. Ingres - limite dans une sous-requête
    Par raphoun07 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/08/2011, 17h05
  4. Utilisation de colonnes dans une sous-requête
    Par boubacach dans le forum SQL
    Réponses: 5
    Dernier message: 31/05/2010, 10h55
  5. Contourner le non-support de limit dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/09/2007, 10h45

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