Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/09/2011, 11h22   #1
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
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
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 13h42   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Code :
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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 14h47   #3
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
merci bcp pour la réponse
mais groupe by ques ce quelle fait exactement, est ce que je peut l'enlever??
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 14h55   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
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

Citation:
est ce que je peut l'enlever??
Non.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 15h04   #5
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
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???
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 15h24   #6
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 15h50   #7
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
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
//////////////////////////////////////////////////////////////////////////////////////////////////////////
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2011, 17h36   #8
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
A partir de tes données j'ai fait :

Code :
1
2
3
SELECT `IANNEXE` , `IANNEEINS` , `INSEQ` , icode, MAX( IANNEE )
FROM ins
GROUP BY IANNEXE, IANNEEINS, INSEQ
Ce qui m'a donné :

Code :
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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 09h44   #9
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
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.
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h16   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h40   #11
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
merci pour votre réponse, j'espere que ça va marcher, je vais l'essayer maintenant
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 10h55   #12
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
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.*
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 12h01   #13
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 12h15   #14
Membre à l'essai
 
Inscription : septembre 2008
Messages : 102
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 102
Points : 24
Points : 24
daccord merci beaucoup vous m'avez vraiment aidé à resoudre un probleme de surcharge sur le serveur
merci bcp
Amel_B est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h19.


 
 
 
 
Partenaires

Hébergement Web