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 :

Requetes utilisant des groupby et DISTINCT [MySQL-5.7]


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 83
    Points
    83
    Par défaut Requetes utilisant des groupby et DISTINCT
    Bonjour,

    Je doit faire une requete sur uen table principale qui utilise une autre et obtenir un resutat de synthèse.

    Par exemple ici j'ai une table enregistrement qui stock tous les enregistrement : les champs sont 'vehicule_immat' et 'enregistrements_createdAt'. J'ai crér cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT `vehicule`.`immat` AS `vehicule_immat`,
    `enregistrements`.`createdAt` AS `enregistrements_createdAt`
    FROM `enregistrements` `enregistrements` 
    LEFT JOIN `vehicules` `vehicule` ON `vehicule`.`id`=`enregistrements`.`vehiculeId` 
    GROUP BY `vehicule`.`immat`, `enregistrements`.`createdAt`
    ORDER BY `enregistrements`.`createdAt` DESC
    J'obtiens cela par exemple :


    vehicule_immat enregistrements_createdAt
    CZ-381-YW 2018-05-12 08:35:56
    CZ-381-YW 2018-05-12 08:35:55
    CZ-381-YW 2018-05-12 08:35:54
    CZ-381-YW 2018-05-12 08:35:53
    EE-338-VB 2018-05-12 08:35:53
    DX-879-BL 2018-05-11 11:11:36
    DX-879-BL 2018-05-11 11:11:35
    DX-879-BL 2018-05-11 11:11:34
    DX-879-BL 2018-05-11 11:11:33
    DX-879-BL 2018-05-11 11:11:32
    DX-068-RV 2018-05-11 06:03:27
    DX-068-RV 2018-05-11 06:03:26
    DA-550-SK 2018-05-10 19:00:49
    DA-550-SK 2018-05-10 19:00:48
    DA-550-SK 2018-05-10 19:00:47
    DA-609-XL 2018-05-09 20:00:04
    DA-609-XL 2018-05-09 20:00:03
    ED-543-YY 2018-05-09 08:18:01
    EE-635-EC 2018-05-09 07:55:21
    EE-635-EC 2018-05-09 07:55:20
    EE-635-EC 2018-05-09 07:55:19

    Et j'aimerais obtenir un résultat comme cela :

    vehicule_immat enregistrements_createdAt
    CZ-381-YW 2018-05-12 08:35:56
    EE-338-VB 2018-05-12 08:35:53
    DX-879-BL 2018-05-11 11:11:36
    DX-068-RV 2018-05-11 06:03:27
    DA-550-SK 2018-05-10 19:00:49
    DA-609-XL 2018-05-09 20:00:04
    ED-543-YY 2018-05-09 08:18:01
    EE-635-EC 2018-05-09 07:55:21

    Comment donc faire pour obtenir le 2nd ? a savoir immatriculation unique en fonction de la derniere date ?

    Merci de votre aide

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT `vehicule`.`immat` AS `vehicule_immat`,
    `enregistrements`.`createdAt` AS `enregistrements_createdAt`
    FROM `enregistrements` `enregistrements` 
    LEFT JOIN `vehicules` `vehicule` ON `vehicule`.`id`=`enregistrements`.`vehiculeId` 
    GROUP BY `vehicule`.`immat`, `enregistrements`.`createdAt`
    ORDER BY `enregistrements`.`createdAt` DESC
    À quoi peut bien servir de poser des alias de tables qui sont identiques aux noms des tables ?

    Comment donc faire pour obtenir le 2nd ? a savoir immatriculation unique en fonction de la derniere date ?
    Si j'ai bien compris, vous cherchez la dernière date de chaque véhicule ?
    => Il suffit de grouper par immatriculation et de prendre la date maxi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT v.immat AS vehicule_immat
    	MAX(e.createdAt) AS enregistrements_createdAt
    FROM enregistrements e
    LEFT JOIN vehicules v ON v.id = e.vehiculeId
    GROUP BY v.immat
    ORDER BY enregistrements_createdAt DESC
    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
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Citation Envoyé par CinePhil
    => Il suffit de grouper par immatriculation et de prendre la date maxi.
    Non, ce n'est pas ainsi que l'on récupère la ligne possédant la plus grande date.
    Et si Paul75 désire récupérer une autre colonne dans la table véhicule, elle ne sera pas en conformité avec la date extraite !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT     v.immat      AS vehicule_immat
               e.createdAt  AS enregistrements_createdAt
     
         FROM  enregistrements as e
     
    LEFT JOIN  vehicules       as v
           ON  v.id = e.vehiculeId
     
        WHERE  e.createAt = ( select max(v2.createAt) from vehicules as v2 where v2.id = e.vehiculeId )
     
     GROUP BY  v.immat
     ORDER BY  e.createAt DESC
    Si la plus grande date est unique, le "group by" ne sert à rien.
    Il garantit l'unicité de la ligne extraite de la table "vehicules".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour
    Non, ce n'est pas ainsi que l'on récupère la ligne possédant la plus grande date.
    La requête de Cinéphile est tout a fait correcte pour le besoin exprimé, au contraire de la votre, qui sera moins performante, en plus d'être incorrecte avec un GROUP BY non conforme.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut aieeeuuuuu.

    Avez-vous compris la demande :
    Citation Envoyé par Paul75
    Comment donc faire pour obtenir le 2nd ? a savoir immatriculation unique en fonction de la dernière date ?
    D'une part, nous ne savons pas si la dernière date est unique dans la table.
    D'où la nécessite de récupérer un seul tuple.

    Et d'autre part, rien n'indique dans sa demande qu'il désire récupérer seulement que ces deux colonnes.
    Mais avant de penser à la performance, faut-il encore fournir le bon résultat.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  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
    Il donne la description de ce qu'il souhaite comme résultat :
    Et j'aimerais obtenir un résultat comme cela :

    vehicule_immat enregistrements_createdAt
    CZ-381-YW 2018-05-12 08:35:56
    EE-338-VB 2018-05-12 08:35:53
    DX-879-BL 2018-05-11 11:11:36
    DX-068-RV 2018-05-11 06:03:27
    DA-550-SK 2018-05-10 19:00:49
    DA-609-XL 2018-05-09 20:00:04
    ED-543-YY 2018-05-09 08:18:01
    EE-635-EC 2018-05-09 07:55:21
    C'est à dire une ligne par immatriculation avec, pour chaque immatriculation, la date/heure maxi de celle-ci.

    Et comme il marqué son sujet comme résolu, on peut arrêter d'ergoter, non ?
    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
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut CinePhil.

    Citation Envoyé par CinePhil
    on peut arrêter d'ergoter, non ?
    Il ne s'agit pas d'ergoter, mais de donner les bonnes démarches !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. connecté a ma bd mysql, comment utiliser des requetes
    Par impacto dans le forum Accès aux données
    Réponses: 1
    Dernier message: 28/08/2011, 18h45
  2. Réponses: 4
    Dernier message: 20/01/2010, 11h25
  3. utiliser des variables dans une requet INSERT
    Par k_boy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/12/2009, 10h45
  4. [MySQL] Utilisation des valeur choix multiple pour executer une requete une valeur a la fois
    Par guigui69 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/12/2007, 16h43
  5. Réponses: 11
    Dernier message: 19/07/2006, 18h28

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