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 :

Comment faire un requête imbriquée ?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai Avatar de Boudha25
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Janvier 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2019
    Messages : 32
    Points : 24
    Points
    24
    Par défaut Comment faire un requête imbriquée ?
    Bonjour,
    J'aimerais faire une requête sur le résultat d'une autre requête. Je ne comprends pas trop la syntaxe a suivre pour y arriver. Voici un extrait de ma table (Pumptrack):
    ID compteur1 sens moment
    51 7 1 2021-07-04 15:39
    52 8 1 2021-07-04 15:39
    53 9 1 2021-07-04 15:40
    54 8 3 2021-07-04 15:40
    55 7 3 2021-07-04 15:40

    Voici la requête que je fais sur ma table. Je fais la somme de toute les sens à 1 dans une journée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT date(moment) as date, SUM(sens) as entree 
    FROM Pumptrack
    WHERE (sens) = 1 
    group by 1 
    ORDER BY date(moment) DESC
    LIMIT 5
    Voici le résultat que j'obtient:
    date entrée
    2021-09-04 875
    2021-09-03 425
    2021-08-29 48
    2021-08-28 582

    Ce que j'aimerais faire comme 2e requête est de trouver le MAX de la colonne entrée avec la date correspondant. J'ai essayé de d'imbriquer cette requête (SELECT date(moment) as date, MAX(sens) as record FROM Pumptrack WHERE 1) dans le from et dans le where, mais je n'y arrive pas.
    Est-ce que quelqu'un peut m'aider ou me guider?
    Merci!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Pas besoin de sous requête...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT date(moment) as date, SUM(sens) as entree, MAX(SUM(sens)) OVER() as max_entree
    FROM Pumptrack
    WHERE (sens) = 1 
    group by 1 
    ORDER BY date(moment) DESC
    LIMIT 5
    Lisez mon cours sur le SQL, notamment :
    https://sqlpro.developpez.com/articl...clause-window/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai Avatar de Boudha25
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Janvier 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2019
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Merci pour la réponse. Elle donne effectivement le max d'entrée, par contre j'aimerais savoir quel journée a été le max. C'est pour sortir une statistique. J'aimerais savoir quelle journée à été le plus achalandée et le nombre d'entrée. Dans mon exemple, j'aimerais avoir comme réponse:


    date entree
    2021-09-04 875
    Je vais me renseigner sur la fonction OVER(), je ne connaissait pas cette fonction.

    Merci.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    OVER n'est pas une fonction. C'est une clause des fonctions fenêtrées, admettant différentes parties (PARTITION BY... ORDER BY... ROWS/RANGE..) encore assez mal implémenté sous MySQL qui, a bien des aspects à plus de 20 ans de retard en matière de SQL...

    Pour retrouver le ou les tuples afférent(s) au MAX, là il faut une sous requête...

    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH 
    T AS
    (
    SELECT date(moment) as date, SUM(sens) as entree, MAX(SUM(sens)) OVER() as max_entree
    FROM Pumptrack
    WHERE (sens) = 1 
    group by date(moment)
    ) 
    SELECT *
    FROM   T
    WHERE  entree = max_entree;
    Et pour un cours sur les CTE (clause WITH) lire : https://sqlpro.developpez.com/cours/...te-recursives/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre à l'essai Avatar de Boudha25
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Janvier 2019
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2019
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup, ça fonctionne très bien. Pour être sur que je comprends le raisonnement de la requête. On enregistre le résultat du premier select dans T et ensuite on refait un select dans T et on le compare à notre OVER(). Ici tu as fait un select *, mais on aurait pu faire un select date et entree pour avoir seulement ce que l'on cherche.
    Encore une fois merci beaucoup.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    A peu de chose près c'est cela. Mais la table T n'existe pas. C'est une simple formulation qui, du point de vue mathématique est une factorisation... Il n'y a donc rien "d'enregistré". On peut comprendre que T est une vue virtuelle qui n'existe que le temps de répondre à ma requête... On appelle cela une expression de table (en anglais CTE pour common table expression).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Comment faire une requête UPDATE imbriquée ?
    Par TSAFACK-M dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/08/2020, 16h46
  2. Comment faire ma requête SELECT ?
    Par MaTHieU_ dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/07/2006, 16h23
  3. [SQL] Comment faire ma requête
    Par kaiserazo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/05/2005, 10h39
  4. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 22h52

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