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

PHP & Base de données Discussion :

extraire un seul enregistrement pour chaque eleve [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut extraire un seul enregistrement pour chaque eleve
    Bonjour
    s'il vous plait j'ai un probleme si vous pouvez m'aider??
    j'ai une table qui contien plusieurs enregistrements des eleves
    jai un champh appelé date_ins il contient l'annee scolaire par exemple 2011/2012 ou bien 2010/2011, chaque eleve à plusieurs date_ins, je veux extraire un seul enregistrement pour chaque eleves qui contient la derniere annee qu'il a inscris.

    les deux champs de la table eleve:
    chapms1==>code_eleve
    champs2==>date_ins

    chaque eleve à plusieurs enregistrements d'aprés les années quil a inscri
    merci

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT code_eleve, MAX(date_ins) AS date_ins
    FROM eleves
    GROUP BY code_eleve
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut
    merci bcp pour la réponse
    mais groupe by ques ce quelle fait exactement, est ce que je peut l'enlever??

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Amel_B Voir le message
    merci bcp pour la réponse
    mais groupe by ques ce quelle fait exactement
    http://www.google.fr/search?q=sql+group+by

    est ce que je peut l'enlever??
    Non.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut
    en réalité le code de l'eleve dans ma table est composé de 3 champs , donc je fait le groupe by sur les 3 champs" groupe by ch1,ch2,ch3???

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Amel_B Voir le message
    en réalité le code de l'eleve dans ma table est composé de 3 champs , donc je fait le groupe by sur les 3 champs" groupe by ch1,ch2,ch3???
    Oui voilà
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut
    svp si vous avez le temps??
    voilà un exemple d'une ptit table INS si vous pouvez l'essayer
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    -- phpMyAdmin SQL Dump
    -- version 3.3.2
    -- http://www.phpmyadmin.net
    --
    -- Serveur: 127.0.0.1
    -- Généré le : Dim 18 Septembre 2011 à 14:31
    -- Version du serveur: 5.1.49
    -- Version de PHP: 5.3.3

    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

    --
    -- Base de données: `scolarite01`
    --

    -- --------------------------------------------------------

    --
    -- Structure de la table `ins`
    --

    CREATE TABLE IF NOT EXISTS `ins` (
    `NPR` int(5) NOT NULL,
    `IANNEXE` varchar(2) NOT NULL,
    `IANNEEINS` varchar(4) NOT NULL,
    `INSEQ` varchar(5) NOT NULL,
    `IANNEE` varchar(9) NOT NULL,
    `ORDREC` int(5) NOT NULL,
    `ICODE` varchar(3) NOT NULL,
    `STATUT` varchar(16) NOT NULL,
    `DATEINS` date NOT NULL DEFAULT '0000-00-00',
    `FRAISINS` varchar(5) NOT NULL,
    `MODEPAIE` varchar(20) NOT NULL,
    `CATEGORIE` varchar(50) NOT NULL,
    `MOTIFINS` varchar(30) NOT NULL,
    `ANIMATION` int(1) NOT NULL DEFAULT '0',
    `INFORMATIQUE` int(1) NOT NULL DEFAULT '0',
    `COURRIER` varchar(20) NOT NULL,
    `MENTION` varchar(16) NOT NULL,
    `MODE` varchar(20) NOT NULL,
    `INSCRITBAC` varchar(1) NOT NULL DEFAULT '0',
    `STML` varchar(1) NOT NULL DEFAULT '0',
    PRIMARY KEY (`IANNEXE`,`IANNEEINS`,`INSEQ`,`IANNEE`),
    UNIQUE KEY `ordr_unq` (`IANNEE`,`ICODE`,`ORDREC`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    --
    -- Contenu de la table `ins`
    --

    INSERT INTO `ins` (`NPR`, `IANNEXE`, `IANNEEINS`, `INSEQ`, `IANNEE`, `ORDREC`, `ICODE`, `STATUT`, `DATEINS`, `FRAISINS`, `MODEPAIE`, `CATEGORIE`, `MOTIFINS`, `ANIMATION`, `INFORMATIQUE`, `COURRIER`, `MENTION`, `MODE`, `INSCRITBAC`, `STML`) VALUES
    (0, '01', '2008', '00001', '2008/2007', 1, '312', 'جديد', '2007-09-19', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'مقبول', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00002', '2008/2007', 2, '312', 'جديد', '2007-09-29', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'مقبول', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00003', '2008/2007', 3, '312', 'جديد', '2007-09-15', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'مقبول', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00003', '2009/2008', 8, '312', 'جديد', '2007-09-15', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'معيد', 'بالمراسلة', '0', '0'),
    (0, '01', '2010', '00004', '2008/2007', 4, '312', 'جديد', '2007-09-15', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'بالمراسل', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00004', '2009/2008', 9, '312', 'جديد', '2007-09-15', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'معيد', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00005', '2008/2007', 5, '312', 'جديد', '2007-09-05', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'مقبول', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00001', '2012/2011', 6, '404', 'جديد', '2007-09-15', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'مقبول', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00007', '2008/2007', 7, '312', 'جديد', '2007-11-05', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'مقبول', 'بالمراسلة', '0', '0'),
    (0, '01', '2008', '00008', '2008/2007', 8, '312', 'جديد', '2007-09-15', '2000', 'Ø*والة', 'متمدرس', 'مواصلة الدراسة', 0, 0, '0', 'مقبول', 'بالمراسلة', '0', '0');
    //////////////////////////////////////////////////////////////////////////////////////////////////////////

    et voilà la requette que j'ai executé

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    SELECT `IANNEXE` , `IANNEEINS` , `INSEQ` , icode, MAX( IANNEE )
    FROM INS, ELEVE
    WHERE IANNEXE = ANNEXE
    AND IANNEEINS = ANNEEINS
    AND INSEQ = NSEQ
    GROUP BY IANNEXE, IANNEEINS, INSEQ
    //////////////////////////////////////////////////////////////////////////////////////////////////////////

    mais ça n'a pas donné le résulta voulu car par exemple concernant l'enregistrement

    01 2008 00001 312 2012/2011

    normalement en 2012/2011 son ICODE est 404 pas 312
    son ICODE 312 est dand l'annee 2007/2008
    //////////////////////////////////////////////////////////////////////////////////////////////////////////

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    A partir de tes données j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `IANNEXE` , `IANNEEINS` , `INSEQ` , icode, MAX( IANNEE )
    FROM ins
    GROUP BY IANNEXE, IANNEEINS, INSEQ
    Ce qui m'a donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IANNEXE 	IANNEEINS 	INSEQ 	icode 	MAX( IANNEE )
    01 	2008 	00001 	312 	2012/2011
    01 	2008 	00002 	312 	2008/2007
    01 	2008 	00003 	312 	2009/2008
    01 	2008 	00004 	312 	2009/2008
    01 	2008 	00005 	312 	2008/2007
    01 	2008 	00007 	312 	2008/2007
    01 	2008 	00008 	312 	2008/2007
    01 	2010 	00004 	312 	2008/2007
    Et me semble correct : on ne récupère que le plus grand IANNEE de chaque triplet IANNEXE-IANNEEINS-INSEQ.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut
    bonjour

    oui justement c'est ce que j'ai eu, mais cet enregistrement

    dans la table il est comme ça: '01' '2008', '00001', '2012/2011', 6, '404'
    mais la requette l'affiche comme ça: '01' 2008 00001 312 2012/2011.

    c'est a dire dans la table le icode de cette enregistrement dans l'annee 2012/2011 est 404.
    tandisque la requette affiche le icode de cet enregistrement 312 en 2012/2011.

    alors que le icode 312 de cet enregistrement dans la table est en 2008/2007

    donc il ne filtre pas le icode d'aprés l'annee , il donne le max de iannee et prend le premier icode de l'enregistrement comme il le trouve dans la table.

    j'espere que je vous ai bien expliqué le probleme.
    si vous pouvez m'aider.

  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
    Tu viens de découvrir l'un des gros défaut de MySQL qui est trop permissif avec la norme SQL ! Un autre SGBD aurait refusé ta requête car toutes les colonnes figurant dans le SELECT et ne faisant pas l'objet d'une fonction de groupage (MIN, MAX, AVG, SUM, COUNT) doivent figurer dans le GROUP BY. Sinon les colonnes manquantes retourneront des résultats aléatoires.

    Si tu veux récupérer le icode correspondant au MAX(IANNEE), il te faut alors une sous-requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT i.IANNEXE, i.IANNEEINS, i.INSEQ, i.icode, i.IANNEE
    FROM ins i
    INNER JOIN
    (
        SELECT IANNEXE, IANNEEINS, INSEQ, MAX( IANNEE ) AS iannee_max
        FROM ins
        GROUP BY IANNEXE, IANNEEINS, INSEQ
    ) tmp 
        ON tmp.IANNEXE = i.IANNEXE
        AND tmp.IANNEEINS = i.IANNEEINS
        AND tmp.INSEQ = i.INSEQ
        AND tmp.ianne_max = i.IANNEE
    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 régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut
    merci pour votre réponse, j'espere que ça va marcher, je vais l'essayer maintenant

  12. #12
    Membre régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut
    merci bcp pour la requete elle fonctionne bien , maisla table ins a d'autres champs il faut que les affiche ,
    est ce que je peux remplacer cette ligne
    SELECT i.IANNEXE, i.IANNEEINS, i.INSEQ, i.icode, i.IANNEE
    par:
    SELECT i.*

  13. #13
    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
    Non, il vaut mieux éviter de relancer la guerre des étoiles !
    Mais tu peux ajouter d'autres colonnes (et pas champs ! ) au SELECT en plus de icode.
    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 !

  14. #14
    Membre régulier
    Inscrit en
    Septembre 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 202
    Points : 76
    Points
    76
    Par défaut
    daccord merci beaucoup vous m'avez vraiment aidé à resoudre un probleme de surcharge sur le serveur
    merci bcp

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 15/04/2010, 14h23
  2. [AC-2000] Extraire le premier enregistrement de chaque rupture
    Par Jaimelot dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/10/2009, 09h30
  3. [AC-2003] comment compter les enregistrements pour chaque mois
    Par bogmarley dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/09/2009, 10h31
  4. [MySQL] Créer un enregistrement pour chaque ligne d'une zone de texte
    Par JackBeauregard dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/09/2009, 20h14
  5. afficher les 10 premiers enregistrements pour chaque groupe
    Par freestyler dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2008, 15h46

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