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 :

Requete group by et tri par date


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut Requete group by et tri par date
    Bonjour,
    requete assez simple je pense mais je cale...

    Les employés d'une entreprise passent un test, je stocke les résultats dans une table avec la date à laquelle ils ont passé le test.

    Je voudrais ensuite retourner une liste contenant tout les résultats des tests pour une entreprise donnée mais un seul test par personne, le dernier fait.

    Voici ma table :

    tbl_Test :
    idTest | idEmploye | detailQuestion | dateTest | soutienS
    1 | 29 | 2-2-2-3-3-3| 2010-01-12 13:13:27 | 1
    2 | 29 1-2-2-3-3-3 | 2009-01-12 13:13:27 | 2
    3 | 30 | 2-1-2-3-3-3 | 2010-02-12 13:13:27 |2
    4 | 31 | 2-2-4-3-3-3 | 2010-01-12 08:13:27 |1
    5 | 14 | 2-2-4-3-3-3 | 2010-01-12 08:13:27 |2

    je voudrais donc retourner les enregistrements 1, 3 et 4
    (pas n°2, car cet employe '29' a fait un test apres, le n°1)
    (pas n°5 car l'employé '14' n'appartient pas à la meme entreprise, defini ailleur)


    Voici ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT e.id, k.detailQuestion
    FROM employe e, tbl_Test k
    WHERE e.idEntreprise =  '32'
    AND e.id = k.idEmploye
    GROUP BY e.id

    Alors cette requete marchouille... elle me retourne tout les tests faits par les employes de l'entreprise '32' avec un seul test par personne, mais pas forcement LE BON
    je voudrais le dernier en date..

    il faudrait integer un order by dateTest ??? mais où ? comment ?? après le group BY ? ou alors un distinct e.id puis dateTest ASC ????

    ensuite j'ai essaye ca, mais ca va pas non plus, il me retourne un seul id employe mais les resultats de tous les tests de cet employe sont concatenes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT e.id, GROUP_CONCAT( k.detailQuestion
    ORDER BY k.dateTest DESC 
    SEPARATOR  ';' ) liste
    FROM employe e, tbl_Test k
    WHERE e.idEntreprise =  '32'
    AND e.id = k.idEmploye
    GROUP BY e.id
    et puis j'aime pas car j'ai besoin de faire le group_concat sur un autre champ apres.... et la je saurais plus ou mettre ma date.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT e.id, 
    GROUP_CONCAT(k.soutienSoc ORDER BY k.soutienSoc ASC SEPARATOR ';') 
    liste FROM employe e, tbl_Test k 
    WHERE e.idEntreprise = '32' AND e.id = k.idEmploye GROUP BY e.id
    merci de votre aide

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    je dirai sans regarder ton schéma

    je sélectionne l'id max (ou la date max) du test pour tout les groupes d'entreprise.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT MAX( idtest )
    FROM test
    GROUP BY entreprise

    maintenant qu'on a ça on emballe les résultat dans une requete d'affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT guerre_des_etoiles
    FROM test 
    WHERE test.idtest IN 
    (
     SELECT MAX( idtest )
     FROM test
     GROUP BY entreprise 
    )
    fastoche non?

  3. #3
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    fastoche non?
    excellent !! merci pour ton aide
    je suis ton modèle et ma requête marche !! mais....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT k.* FROM employe e, tbl_test k
    WHERE e.idEntreprise =  '32' AND e.id = k.idEmploye
    AND k.dateTest IN  (
    
    SELECT MAX( tk.dateTest )
    FROM tbl_test tk GROUP BY idEmploye
    )
    MAIS j'aime pas le
    AND k.dateTest IN (.... si un autre test a la même date... je risque d'avoir un beau bug non ?
    alors j'ai essayé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND k.idTest IN ( SELECT tk.idTest, MAX( tk.dateTest )
    mais belle erreur SQL : #1241 - Operand should contain 1 column(s)

    alors suis un peu une idée ?

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    à ton avis si je n'ai mis qu'une seule colonne dans la requete imbriquée, etait-ce du au hasard?

    tu me forces a réfléchir comment adapter ma soluce à ton probleme...

  5. #5
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    tu auras jamais deux fois la meme date parce que le MAX() d'un groupe est un singleton ou l'ensemble vide s'il n'est pas défini (en sql ça veut dire sur un ensemble vide). On apprends quoi en maths?

    il me viens à l'esprit que tu ne maitrise pas totalement la notion d'agregation de groupe en sql. me trompè-je?

  6. #6
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    ok

    je comprends

    excuse d'abord j'avais mal lu le probleme, j'avais compris dernier employé de chaque usine et non ce qu'il fallait.

    tu vas utiliser le max(date) c'est un timestamps il n'y en aura probablement qu'un seul à la fois, et s'il y en a deux simultané c'est foutu. bienvu. pourquoi? parce que la date ne permet pas d'identifier une ligne, c'est pas une clé primaire.

    Or idTest a la saveur d'une clé primaire dans ton exemple, en plus il semble être autoincrement! utilisons donc une sympathique propriété des autoincrement, à savoir qu'il sont ordonnés (le plus grand c'est le denier créé ). idTest est bien de autoincrement dans la table tbl_test? dans ce cas ça suffit. si tu chopes le dernier autoincrement de chaque employé et tu as le plus récent des tests passés dans l'entreprise et l'astuce refonctionne (jusqu'à ce que tu retripatouille les autoinc parce que tu va voir qu'il y a des trous ou parce que tu a dépassé max autoinc.... mais tu as le temps.)


    Autre chose, vu ce que tu fais avec ta colonne employé, il est inutile de suggérer d'y mettre un index de type "avec doublon", parce que tu y auras déjà pensé.

    pour finir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM employe AS e INNER JOIN tbl_test AS k ON e.id = k.idEmploye
    WHERE  
    AND k.idTest IN  
    (
        SELECT MAX( k2.idTest ) 
        FROM tbl_test AS k2 
        WHERE k2.idEntreprise = "32"
        GROUP BY k2.idEmploye
     
    )
    /gene69 va se coucher. D'ailleurs c'est parce qu'il est fatigué qu'il a mi une étoile. toi dans ton code tu ne feras pas ça. c'est dangereux.

  7. #7
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    tu as tout compris

    le timestamp serait vraiment un manque de bol si completement identique... mais je crois que je vais garder ca, car je vois pas d'autres solutions.......

    Aussi, oui j'avais bien pensé à utiliser l'autoincrement de l' idTest MAIS (ya tjs des mais) si un utilisateur veut modifier son test, l'id du test reste inchangée, mais là je fais un update sur la date..... donc je peux pas certifier que le test id 1 est antérieur au test 2... (update date where idtest= etc etc)

    Autre chose, vu ce que tu fais avec ta colonne employé, il est inutile de suggérer d'y mettre un index de type "avec doublon", parce que tu y auras déjà pensé.
    oui je peux pas, car on peut faire plusieurs tests par employé.

    mi une étoile. toi dans ton code tu ne feras pas ça. c'est dangereux.
    ca je savais pas, merci

    Bon en tout cas merci beaucoup de ton aide.

  8. #8
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    sinon y avait peut etre en utilisant dans la requête imbriquée un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ORDER BY  dateTest ASC 
    LIMIT 0 , 1
    mais suis pas plus inspirée..

Discussions similaires

  1. [SQL-VBA]tri par date dans access
    Par Mickey_Mouse dans le forum VBA Access
    Réponses: 5
    Dernier message: 06/02/2007, 09h49
  2. Optimisation d'un tri par date
    Par padawa dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/05/2006, 15h48
  3. requete : tri par date + groupement
    Par cbe dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/01/2006, 19h30
  4. tri par date
    Par Digiduck dans le forum Requêtes
    Réponses: 5
    Dernier message: 06/06/2005, 21h51
  5. [ XML ][ XSL ] tri par date
    Par zozolh2 dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/08/2004, 10h19

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