Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 29/12/2012, 09h47   #1
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Par défaut pourcentage plus proche de la note de nicolas

Bonjour,

Je me permet de poser ma question ici apres capitulation..
Dans le cadre d'un college, j'éssaie via mysql de faire une requete
permetant :

de lister toutes les notes des éleves du college et de les trier en pourcentage
du plus proche(en terme d écart) au plus grand d'un eleve donné !


jai 2 colonne dans ma base. prenom et note.
Si on prend nicolas, il a 16(demoyenne generale) , si un autre eleve à 16 dans le college il aura 100% et sera donc en premier resultat de la recherche.

Si en plus on pouvait exclure du résultat de la recherche celui de l'éleve donné (en l'occurence nicolas) ce serait magique mais j'en suis pas la..

Merci à ceux qui voudrons bien se pencher sur mon probleme


Jess
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 10h11   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Il faut décomposer ton problème.

Commence par faire une requête qui cherche la plus grande note de l'élève choisi pour référence.

Fais une autre requête qui donne la liste de toutes les notes des élèves sauf celui en référence.

Dans la requête finale, fais un produit cartésien (FULL OUTER JOIN) entre les deux requêtes, ce qui te permettra de calculer le pourcentage de toutes les notes par rapport à celle de référence puis trie par ordre décroissant ce ratio.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 11h46   #3
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Merci pour la réponse,

Citation:
"Commence par faire une requête qui cherche la plus grande note de l'élève choisi pour référence."
Je n'ai pas acces aux différentes note je n'ai q'une note moyenne générale.

Citation:
"Fais une autre requête qui donne la liste de toutes les notes des élèves sauf celui en référence."
Ca j'arrive à le faire dans mon code php de cette manière :
Code :
1
2
3
4
5
6
7
8
9
 
 
$req2 = mysql_query("SELECT ELEVES FROM classe WHERE ELEVES <> '$session'" );
 
	while($reqtemp=mysql_fetch_array($req2))  {
 
	echo "<pre>"; 
	echo  $reqtemp['ELEVES'];  
	echo "<pre>";
( La jai séléctionner uniquement tous les noms des éleves mais je pense que cest le meme principe pour les notes )

Citation:
Dans la requête finale, fais un produit cartésien (FULL OUTER JOIN) entre les deux requêtes
La on y est , cest du chinois pour moi
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 13h00   #4
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Tu sélectionnes une colonne ELEVES (qui devrait être nommée au singulier ) alors que tu as dit dans ton premier message ceci :
Citation:
jai 2 colonne dans ma base. prenom et note.
Maintenant que tu parles de moyenne, je crois comprendre que cette colonne "note" est en fait une moyenne et non pas une note ?

C'est le même principe cependant. Je reste avec la structure de table que tu as donnée et je reprends mon descriptif de la solution...

Citation:
Envoyé par CinéPhil
Commence par faire une requête qui cherche la plus grande note de l'élève choisi pour référence.
Donc en fait, si j'ai bien compris, tu n'as qu'une seule note (moyenne en réalité) par élève ?
Code :
1
2
3
SELECT note
FROM classe
WHERE prenom = '$prenom'
Citation:
Fais une autre requête qui donne la liste de toutes les notes des élèves sauf celui en référence.
Code :
1
2
3
SELECT prenom, note
FROM classe
WHERE prenom <> '$prenom'
Citation:
Dans la requête finale, fais un produit cartésien (FULL OUTER JOIN) entre les deux requêtes
Code :
1
2
3
4
5
6
7
8
9
SELECT c.prenom, c.note,
	tmp.note AS note_reference
FROM classe c
FULL OUTER JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = '$prenom'
) tmp
Citation:
ce qui te permettra de calculer le pourcentage de toutes les notes par rapport à celle de référence puis trie par ordre décroissant ce ratio.
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	(100 * c.note) / tmp.note AS pourcentage
FROM classe c
FULL OUTER JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = '$prenom'
) tmp
ORDER BY pourcentage DESC
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 13h49   #5
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Merci de maider cinephil

Citation:
Maintenant que tu parles de moyenne, je crois comprendre que cette colonne "note" est en fait une moyenne et non pas une note ?
Exact, je me suis mal exprimée . Jai une colonne prénom pour les prénom et une colonne note(qui correspond effectivement à une moyenne) .

Dapres ta réponse, jai déja vu les AS pour utiliser des alias mais je ne sais pas à quoi corresponde les tmp. ou c.

Jai testé ton code sous cette forme dans mon code php mais n'ayant point l'habitude de requetes complexes, jai du fautée dans la syntaxe ou autre, jai donc fais 3 requetes..:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
		$req1 = mysql_query("SELECT note
FROM classe
WHERE prenom = '$prenom'
"  );
 
		$req2 = mysql_query("SELECT prenom, note
FROM classe
WHERE prenom <> '$prenom'"  );
 
		$reqfinale = mysql_query("SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	(100 * c.note) / tmp.note AS pourcentage
FROM classe c
FULL OUTER JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = '$prenom'
) tmp
ORDER BY pourcentage DESC"  );
 
 
	while($reqtemp=mysql_fetch_array($reqfinale))  {
 
	echo "<pre>"; 
	echo  $reqtemp['prenom'];  
	echo "<pre>";
 
	}

Whats wrong with me ?
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 15h24   #6
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
As-tu remarqué que j'ai remplacé ta variable $session, qui prêtait à confusion, par la variable $prenom dans la requête ?

Tu n'as pas besoin des deux premières requêtes, seulement de la troisième.

Commence par tester la requête sur phpMyAdmin ou tout autre outil que tu utilises pour gérer la BDD en remplaçant la variable $prenom par un prénom existant dans la table.

Bref, il faut quand même faire un petit effort d'adaptation de la solution donnée.

tmp et c sont tout simplement d'autres alias pour la table classe et la sous-requête.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 16h15   #7
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Citation:
As-tu remarqué que j'ai remplacé ta variable $session, qui prêtait à confusion, par la variable $prenom dans la requête ?
Oui javais remarqué et dans ma requete php je l'ai bien remplacé par ma variable session qui correspond au prenom de l'éleve qui fait la recherche;
APres qd je test ta requete dans mysql :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	(100 * c.note) / tmp.note AS pourcentage
FROM classe c
FULL OUTER JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = 'paul'
) tmp
ORDER BY pourcentage DESC
Il m'indique cette erreur :
Citation:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN ( SELECT note FROM classe WHERE prenom = 'paul' ) tmp ORDER B' at line 5
Es tu sur que tu n'à pas homis quelque chose ?
Je fais des effort je te le garanti, jai pas décollé mon siege depuis ce matin
8h .
Je me permet de te poser la question, n'es ce pas plus simple/possible de soustraire toute les notte des eleves à celle de référence et de les trier desc ,
cela donerai (il me semble) une liste des éleve ayant le moins d'écart,
ensuite calculé le % via php ? D'une maniere générale je me questionnais sur
la meilleure méthode en terme de performance. Faut il mieux calculer les pourcentage via mysql ou via php ?!

Apres bien sur je ne critique pas ta technique, jaimerais déjà réussir à la faire fonctionner ..

Jess
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 16h25   #8
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Et bien je découvre encore une lacune du mauvais MySQL : il ne connait pas FULL OUTER JOIN !

Essaie avec CROSS JOIN.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 16h43   #9
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
AH ca marche déjà mieux L'inconvénient cest que ca marche bien
pour toute les notes inférieur a celle comparé, celle supérieur donne
des pourcentage supérieur, ex si la note de reference est 10 il va donner 150% à celui qui aura 15. Et comme jaimerai les trier du plus petit écart au plus grand
ca marche moyen, que pense tu de mon idée de soustraire les notes et de calculer le % via php, cest mieux niveau performance ou pas du tout ?!
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 16h59   #10
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Citation:
Envoyé par jesspoub Voir le message
AH ca marche déjà mieux L'inconvénient cest que ca marche bien
pour toute les notes inférieur a celle comparé, celle supérieur donne
des pourcentage supérieur, ex si la note de reference est 10 il va donner 150% à celui qui aura 15. Et comme jaimerai les trier du plus petit écart au plus grand
ca marche moyen, que pense tu de mon idée de soustraire les notes et de calculer le % via php, cest mieux niveau performance ou pas du tout ?!
Je précise dans mon cas pour une note reference à 10 , les note 5 et 15 devraient indiqué le meme pourcentage, car ils ont la meme distance par rapport à 10 ..
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 17h28   #11
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Il vaut mieux calculer directement en SQL.
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	(100 * ABS(c.note - tmp.note) / tmp.note AS ecart_pourcent
FROM classe c
CROSS JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = 'paul'
) tmp
ORDER BY pourcentage
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 17h53   #12
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
TU as une erreure à la ligne 3 !
On va y arriver lol , de mon coté j'arrive à bien les trier grace à
Code :
1
2
3
4
 
 
SELECT prenom
FROM classe  ORDER BY ABS(100-note)");
Ou 100 correspond à la note de l'éleve ; J'arive pas a le mettre en pourcentage via SQL , via php je saurai faire un truc du genre si x>y alor y/x*100 me donnerai le pourcentage, mais via SQL..
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 18h21   #13
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
ORDER BY ecart_pourcent puisque j'ai changé d'alias.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 18h48   #14
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	(100 * ABS(c.note - tmp.note) / tmp.note AS ecart_pourcent
FROM classe c
CROSS JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = 'paul'
) tmp
ORDER BY ecart_pourcent DESC
renvoie une erreure ligne 3 que je crois avoir corigé en rajoutant une paranthese :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	(100 * ABS(c.note - tmp.note) )/ tmp.note AS ecart_pourcent
FROM classe c
CROSS JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = 'paul'
) tmp
ORDER BY ecart_pourcent DESC
Mais cela renvoie le meme resultat que tout a l'heure avec des pourcentage positif ! Le pb cest que dans mon cas le pourcentage doit se calculer de cette maniere : Pour une note référence de 100, 95 et 105 ont tous deux un écart de 5, donc leur pourcentage de la totalité = à 100(la totalité)-5(lécart) =95% !
pour cette meme note reference , 34 donnerai lécart 100-34=66 soit 100-66=34% !

Jai jamais fait de math dans ma vie mais ca alair detre logike ?!

Si tu veux toi ossi capituler je comprendrai .. Cest pas si simple en faite on dirait..
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 19h00   #15
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Pour illustrer mon mernier message, si on prend la note référence 20.
Pierre à 10 et nico à 30 . Avec le calcul des % de base, nico serait à 30/20*100 soit 66% et pierre à 10/20$100 soit 50% et ils ont pourtant le meme écart,
si je déraille dis le moi mais je crois pas..!?
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 19h32   #16
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Si je reprends mon calcul que tu as corrigé en ajoutant la parenthèse manquante :
Code :
(100 * ABS(c.note - tmp.note) )/ tmp.note
Soit 20 la note de référence, c'est à dire tmp.note.
Soit 10 l'autre note à évaluer, c'est à dire c.note.

c.note - tmp.note = 10 - 20 = -10
ABS(c.note - tmp.note) = valeur absolue de -10 = 10
(100 * ABS(c.note - tmp.note) ) = 1000
(100 * ABS(c.note - tmp.note) )/ tmp.note = 1000 / 20 = 50%=> La note à évaluer est à 50% de la note de référence.

Si la note à évaluer est 30, l'écart sera le même (30 - 20 = 10) et donc le pourcentage de distance aussi.

Prenons maintenant une note à évaluer de 18.
c.note - tmp.note = 18 - 20 = -2
ABS(c.note - tmp.note) = valeur absolue de -2 = 2
(100 * ABS(c.note - tmp.note) ) = 200
(100 * ABS(c.note - tmp.note) )/ tmp.note = 200 / 20 = 10%=> La note à évaluer est à 10% de la note de référence. et 18 est bel et bien plus près de 20 (distance moins grande) que 10.

Mais, si j'ai bien compris, tu veux le pourcentage de la note à évaluer par rapport à la note de référence ?

Code :
100 * (1 - (ABS(c.note - tmp.note) / tmp.note))
Pour une note à évaluer de 18, nous aurons cette fois :
100 * (1 - (ABS(18 - 20) / 20)) =
100 * (1 - (ABS(-2) / 20)) =
100 * (1 - (2 / 20)) =
100 * (1 - 0,1) =
100 * (0,9) =
90%

La requête devrait donc être celle-ci si tu veux trier à partir du plus proche :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	100 * (1 - (ABS(c.note - tmp.note) / tmp.note)) AS ecart_pourcent
FROM classe c
CROSS JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = 'paul'
) tmp
ORDER BY ecart_pourcent DESC
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2012, 20h12   #17
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
Boudiou, j'aurai pas trouvée toute seule !! Tout ca a lair de fonctionner comme il faut..Je vais aprofondir pour essayer de mieux comprendre et faire marcher tout ca concretement maintenant mais je t'envoie déjà un enorme merci

Je te souhaite une tres bonne soirée,je vais dormir plus tranquile que la nuit précédente et je vais maintenant essayer de comprendre pourkoi ca marche lol

bize

Jess
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 11h30   #18
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
De bon matin mais cest qd meme passionant !
Je crois bien avoir crier victoire un peu trop vite

Dans ta formule 100 * (1 - (ABS(18 - 20) / 20)) ou 20 est la note de référence
et 18 la note a tester, on se retrouve avec un nombre négatif lorsque le résultat de (x-x)/x) est supérieur à 1 . Deux Exemples :
Paul à la note 9 et il lance sa recherche , jean à 18 et charles à 19 .
100 * (1 - (ABS(18 - 9) / 9))
100 * (1 - (ABS(9) / 9))
100 * (1 - (ABS(1))
100 * (1 - 1)
jean à 0% pour un écart de 9

100 * (1 - (ABS(19 - 9) / 9))
100 * (1 - (ABS(10 / 9))
100 * (1 - (ABS(1,11)
100 * (-0,11)
Charles à -11% pour un ecart de 10 .
quand lucie (qui a 19) fais sa recherche et tombe sur charles(qui a 9) , voila son résultat :

100 * (1 - (ABS(9 - 19) / 19))
100 * (1 - (ABS(10 /19))
100 * (1 - (ABS(0,52)
100 * (0,48)
Lucie à 48% pour un ecart de 10 .


Pour reformuler completement, admetons un point darivé P qui est a 100km
du départ de la course.
jaimerai que Jean J qui a déja effectué 24km soit donc à 100-24 = 76% du point darivé , il lui reste 76% du trajet a parcourir. Lucie qui elle n'à pas vu l'arrivée et à dépassé P de 34km se retrouve a 134-100=34%, il lui reste 34% du trajet a parcourir .

Je ne sais pas si cest plus simple mais j'arrive a sortir le plus petit ecart au plus grand afin que lecart soit toujours positif comme ca :

Code :
1
2
3
4
5
 
SELECT *, ABS((SELECT note FROM classe WHERE prenom = 'paul') - note) AS ecart
FROM classe
WHERE prenom != 'paul'
ORDER BY ecart
Y manquerait plus que les pourcentage que j'arive pas a faire , que pense tu de cette méthode ?! , Je précise que dans ta formule je n'arivais pas à exclure paul de la recherche.

Jess
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 12h25   #19
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Bon alors la formule serait plutôt celle-ci :
Code :
100 * (ABS(c.note - tmp.note) / tmp.note)
Soit une tmp.note (la référence) de 9 et une note de 18, on obtient :
100 * (ABS(18 - 9) / 9) =
100 * (ABS(9) / 9) =
100 * (1) = 100
=> La note 18 est bien à 100% de la note de référence 9.

La requête, avec exclusion de Paul du résultat :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT c.prenom, c.note,
	tmp.note AS note_reference,
	100 * (ABS(c.note - tmp.note) / tmp.note) AS ecart_pourcent
FROM classe c
CROSS JOIN
(
	SELECT note
	FROM classe
	WHERE prenom = 'Paul'
) tmp
WHERE c.prenom <> 'Paul' 
ORDER BY ecart_pourcent DESC
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 13h50   #20
jesspoub
Invité de passage
 
Femme
Inscription : décembre 2012
Messages : 38
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : décembre 2012
Messages : 38
Points : 2
Points : 2
non mais 9 peut pas etre a 100% de 18 ou inversement !
9 est a 100% de 9 et 18 est a 100% de 18, cest en kelke sorte ce que tu avais
fait avant qui reste logique mais ca ne fonctionne pas au vu des exemple que j'ai écrit précédemment , il faudrait retoucher ta formule pour qu'elle ne donne pas des pourcentage négatif ; Sinon avec :
Code :
1
2
3
4
5
 
SELECT *, ABS((SELECT note FROM classe WHERE prenom = 'paul') - note) AS ecart
FROM classe
WHERE prenom != 'paul'
ORDER BY ecart
J'obtiens :

prenom ecart
jean 3
yves 7
george 44
lucie 75
nico 130

ETC.. Quelle ke soit la note de ref ,
on sait maintenant que lécart en % = 100-3=97%
100-7=93%
100-44=56%

Sauf que je crois qu'on rencontre le meme PB
qu'avec ta méthode dés que l'écart dépasse 100 ca donne 100-130=-130%
ca enleve qd meme un probleme , les meme ecart ont maintenant tous le meme pourcentage..Une idée?!
jesspoub est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h30.


 
 
 
 
Partenaires

Hébergement Web