Calcule du nombre d'occurances et affichage du pourcentage.

Eléphanteau du PHP | 22 Messages

12 juil. 2017, 16:13

Bonjour,
Je souhaite calculer le nombre d'occurrences d'une chaine/identifiant dans ma base et afficher le pourcentage de chaque chaine/identifiant.

Voila mon cas :
Ma table "oiseaux" est la suivante :
id, numéro, année, ideleveur,pere, mére,idcanari


Pour l'identifiant du canari, il est calculer comme suite :
idcanari = "numéro"-"année"-"ideleveur"

A chaque enregistrement d'un oiseau, en indique les identifiant canari du pére et la mére.
Exemple d'un oiseau :
Id: 1
numéro : "002"
année : "2016"
ideleveur : AA01
pere : "010-2015-BB01"
mere : ""005-2015-BA02"
idcanari = "002-2016-AA01"

Id: 2
numéro : "005"
année : "2015"
ideleveur : BA02
pere : "010-2015-BB01"
mere : ""050-2013-BA02"
idcanari = "005-2015-BA02"

L'idée est d'utilisé une procédure récursive avec comme paramètre l'idcanari.
mon objectif est de calculer le % de consanguinité dans un pedigree.
Merci pour votre aide.

Voila l'exemple avec le résultat :
Image

Eléphanteau du PHP | 19 Messages

13 juil. 2017, 22:43

Bonsoir,

Attention la requête utilisée ne fonctionne que sur Mysql 8.0.

A partir de votre description je suis parti sur ce modèle :

Code : Tout sélectionner

create table oiseaux( id int AUTO_INCREMENT, numero varchar(100), annee varchar(100), ideleveur varchar(100), pere varchar(100), mere varchar(100), idcanari varchar(100), PRIMARY KEY(id) );
Voici les données :

Code : Tout sélectionner

insert into oiseaux (numero,annee,ideleveur,pere,mere,idcanari) values ('002', '2016','AA01','010-2015-BB01','005-2015-BA02','002-2016-AA01'), -- Pere 1 ('010', '2015','BB01','011-2014-BB01','015-2014-BA02','010-2015-BB01'), -- Grand Mere 1 ('015', '2014','BA02',null,null,'015-2014-BA02'), -- Mere 1 ('005', '2015','BA02','011-2014-BB01','016-2014-BA02','005-2015-BA02'), -- Grand Mere 2 ('016', '2014','BA02',null,null,'016-2014-BA02'), -- Grand Pere commun ('011', '2014','BB01',null,null,'011-2014-BB01');
Et voici la requête :

Code : Tout sélectionner

with recursive cte (id, idcanari, pere,mere) as ( select id, idcanari, pere, mere from oiseaux where idcanari = '002-2016-AA01' union all select p.id, p.idcanari, p.pere, p.mere from oiseaux p inner join cte on p.idcanari = cte.pere || p.idcanari = cte.mere ) select idcanari as 'Id', count(*) as 'Nbr', count(*)/(select count( distinct idcanari) from cte)*100 as '%' from cte group by idcanari order by count(*) desc;

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7256 Messages

14 juil. 2017, 00:38

Wooww, merci Wolan pour cette intervention de qualité, je ne savais même pas que c'était possible avec juste MySQL ! =D>
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 22 Messages

18 juil. 2017, 10:13

OHHHHHH :shock: merci "Wolan" pour ce beau travail, je ne le savais pas que c'est possible via MySQL. BRAVO =D> =D>
J'étais entrain d'essayer de faire fonction en PHP, mais là je suis surpris . bravo
Merci encore, je vais tester et je te tiendrais au courant.

J'adore ce forum :)

Eléphanteau du PHP | 22 Messages

18 juil. 2017, 11:04

Bonjour,
J'ai l'erreur suivante, mais je n'arrive pas à voir d'où ça vient :

#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 'recursive cte (id,idcanari,pere,mere) as (
select id,
idcanari,
pere,
mere
' at line 1

Mammouth du PHP | 1235 Messages

18 juil. 2017, 14:15

vérifie ta version de mysql, probablement infèrieure à 8.0
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Eléphanteau du PHP | 22 Messages

18 juil. 2017, 14:30

@Spols : effectivement, je n'ai pas bien fait attention à la la phrase de Wolan "Attention la requête utilisée ne fonctionne que sur Mysql 8.0" car j'ai bien aimé la solution qu'il m'a proposé que je n'ai pas fait attention.
Oui je suis en version 5.5 (serveur 1&1) .
Dommage car c'était une belle solution, mais j'ai un appris un nouveau truc.