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 :

Optimisation de requête


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut Optimisation de requête
    Je rame avec une autre requete, j'essaye suivant les aides que vous m'avez fourni d'améliorer la requete ci-dessous avec un LEFT JOIN

    Voici ma requete actuelle
    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
    17
     
    SELECT DISTINCT e.id, e.nom, e.prenom, e.type,
     
    				(SELECT type 
    				FROM pointage_ouvrier as p
    				WHERE 
    				DAY(datetimepointage)= '5' and
    				MONTH(datetimepointage)= '9' and
    				YEAR(datetimepointage)= '2017' and
    				p.id_ouvrier = e.id
    				ORDER BY datetimepointage DESC
    				LIMIT 1
    				) as typepointage
     
    				FROM employer as e
    				WHERE e.type='2' or e.type='3' 
    				ORDER BY e.type, e.nom, e.prenom


    Voici celle que je viens de crée, qui est plus rapide mais que ne répond pas vraiment à ma demande.
    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
    17
    18
     
    SELECT DISTINCT e.id, e.nom, e.prenom, e.type,
    t.type as typepointage
    			FROM employer as e
    			LEFT JOIN
    				(SELECT p.id_ouvrier, p.type 
    				FROM pointage_ouvrier as p
    				WHERE 
    				DAY(datetimepointage)= '5' and
    				MONTH(datetimepointage)= '9' and
    				YEAR(datetimepointage)= '2017'
     
                    ORDER BY datetimepointage DESC
    				) as t
    				ON t.id_ouvrier = e.id
     
    			WHERE e.type='2' or e.type='3' 
    			ORDER BY e.type, e.nom, e.prenom

    Je souhaiterais avoir un tableau avec 'id', 'nom', 'prenom', 'type' de la table employer (lorsque le type est = à 2 ou 3) mais en plus avoir la colonne 'typepointage' qui serait le dernier pointage de la journée de cette personne à reprendre dans la table pointage_ouvrier.

    Dans cette dernière table j'ai les colonnes
    'id_ouvrier' --> identique à id de la table employer
    'type' --> type de pointage réaliser
    'datetimepointage' --> date et heure du pointage

    Si j'arrivais à faire un GROUP BY après un ORDER BY ce serait facile mais ce n'est pas possible.
    Je n'arrive donc pas à éliminer les doublons et faire je ne vois que le dernier type de pointage réalisé dans la colonne 'typepointage'

    Comment feriez vous cela ?

  2. #2
    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
    Par défaut
    Bonjour,

    Pour avoir la ligne avec la date la plus récente, il suffit de prendre la ligne pour laquelle il n'existe pas d'autre ligne ayant une date plus récente.

    Vous pouvez donc vous servir de la clause NOT EXISTS pour arriver à vos fins.

  3. #3
    Membre confirmé Avatar de morpheuss
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2013
    Messages : 61
    Par défaut
    Désolé mais je ne comprends pas votre idée, sauriez-vous développer ?

  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
    Par défaut
    Vous pouvez faire une jointure directement sur la table pointage_ouvrier et filtrer les lignes qui ne sont pas les dernières grâce un filtre NOT EXISTS dans le WHERE

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 921
    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 921
    Par défaut
    Salut à tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DAY(datetimepointage)= '5' and
    	MONTH(datetimepointage)= '9' and
    	YEAR(datetimepointage)= '2017' and
    C'est quoi cette écriture ???

    Pourquoi avoir regroupé la partie "date" et la partie "time" dans une seule et même colonne ?

    La bonne écriture serait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datepointage = '2017-09-05'
    Car en faisant cela, votre test sera sargable, ce qui n'est pas le cas dans votre écriture.

    Et du coup, votre requête sera plus performante !

    @+

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT e.id, e.nom, e.prenom, e.type,
    t.type as typepointage
    			FROM employer as e
    Ça fait mal aux yeux ça !

    Il s'agit d'un employé et non pas du verbe employer, non ?

    Essayez comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT e.id, e.nom, e.prenom, e.type,
    	t.type as typepointage
    FROM employer as e
    LEFT JOIN pointage_ouvrier as p ON p.id_ouvrier = e.id
    		AND p.datetimepointage = '2017-09-05'
    WHERE e.type IN (2, 3) 
    ORDER BY e.type, e.nom, e.prenom
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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