Trier des dates dans l'ordre

Fermé
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 - 25 oct. 2012 à 11:33
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 - 29 oct. 2012 à 17:26
Bonjour,

Un enregistrement de ma base (individus), comporte des champs « date_mariage_1, date_mariage_2, date_mariage_3, date_mariage_4 », mais pas forcément dans l'ordre. Et certains peuvent être vides.
Je veux les trier dans l'ordre, sur les 4 derniers caractères de la date qui représente l'année,
$selectA = 'SELECT date_mariage_1,date_mariage_2,date_mariage_3,date_mariage_4 FROM individus WHERE date_mariage_1 != "" AND date_mariage_2 != "" AND date_mariage_3 != "" AND date_mariage_4 != "" ORDER BY RIGHT(date_mariage_1,4).......?????';


Merci de m'aider.

21 réponses

Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
25 oct. 2012 à 13:09
tu veux trier les dates dans l'ordre pour une ligne ou pour toutes les lignes ?
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
25 oct. 2012 à 13:50
J'ai plusieurs 4 champs « date_mariage_1, date_mariage_2, date_mariage_3, date_mariage_4 ». Je veux les trier et afficher par ordre ASC en sélectionnant les 4 derniers caractères du champs (qui correspond à l'année), tout en excluant les champs vides.
si $date1 = date_mariage_1 = 22 NOV 1866
si $date2 = date_mariage_2 = 01 JAN 1850
si $date3 = date_mariage_3
si $date4 =date_mariage_4 = 26 SEP 1868
l'ordre sera $date2, $date 1, $date4.
je devrait donc afficher ce qui correspond à $date2, puis $date1, puis $date4.

Merci à toi.
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
25 oct. 2012 à 14:49
oui ca j'ai bien compris mais en imaginant que tu es un champ id sur ta table

id 1
DATE 1920
DATE 1940
DATE 1980

id2
DATE 1935
DATE 1950

id 3
...


tu veux ca ?

DATE 1920
DATE 1935
DATE 1940
DATE 1950
DATE 1980

ou ça ?
0
Blunderer Messages postés 273 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 6 décembre 2012 83
Modifié par Blunderer le 25/10/2012 à 16:02
il manque un bout de ton message je pense ;)
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
25 oct. 2012 à 18:47
non même pas...
0
Blunderer Messages postés 273 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 6 décembre 2012 83
26 oct. 2012 à 09:57
Ah non j'avais mal compris ton message ;) dsl
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
25 oct. 2012 à 18:07
Pour 1 id = X, j'ai :
date1=1555
date2=1558
date3=
date4=1666
Je veux connaitre l'ordre ASC des dates de l'id X.
Puis, je traite les éléments se référents à date4, puis date1, puis date2.
Où j'en suis :
$id = $_GET['id'];
$selectA = 'SELECT date_mariage_1,date_mariage_2,date_mariage_3,date_mariage_4 FROM xxxx WHERE id LIKE "'.$id.'" '; 
$resultA = mysql_query($selectA,$link) or die ('Erreur : '.mysql_error() );
$rowA = mysql_fetch_array($resultA);

if (!empty($rowA['date_mariage_1']))
{
$date1 = substr($rowA['date_mariage_1'], -4);	
}
if (empty($rowA['date_mariage_1']))
{	$date1 = 9999;	}

if (!empty($rowA['date_mariage_2']))
{
$date2 = substr($rowA['date_mariage_2'], -4);	
}
if (empty($rowA['date_mariage_2']))
{	$date2 = 9999;	}

if (!empty($rowA['date_mariage_3']))
{
$date3 = substr($rowA['date_mariage_3'], -4);	
}
if (empty($rowA['date_mariage_3']))
{	$date3 = 9999;	}

if (!empty($rowA['date_mariage_4']))
{
$date4 = substr($rowA['date_mariage_4'], -4);	
}
if (empty($rowA['date_mariage_4']))
{	$date4 = 9999;	}

Là, je récupère mes années. Si une valeur est vide, je lui donne le maximum (9999).
Mais comment savoir l'ordre des valeurs ASC, en sachant que je veux commencer par la plus petite valeur ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
Modifié par Atropa le 25/10/2012 à 18:57
essai ça :

$rowA = mysql_fetch_array($resultA); 
$a = array($rowA['date_mariage_1'],$rowA['date_mariage_2'],$rowA['date_mariage_3'],$rowA['date_mariage_4']); 
$b = array(); 
for($i = 0;$i < 4;$i++) { 
	if(empty($a[$i])) continue;
 $b[substr($a[$i],-4)] = $a[$i]; 
} 
ksort($b) 

foreach($b as $v) { 
 echo '<p>'.$v.'</p>'; 
}
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
Modifié par t671 le 25/10/2012 à 19:25
Avec, j'ai le message :
Parse error: syntax error, unexpected T_FOREACH

Et pour compliquer les choses, si le plus petit est $rowA['date_mariage_2'], mon premier traitement sera avec "num_cj_2", suivi de "num_cj_1" si c'est l'ordre ASC avec $rowA['date_mariage_1'] ..............
Num_cj, est le numéro de l'individu avec lequel je vais récupérer des informations sur ce dernier.
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
Modifié par Atropa le 25/10/2012 à 19:59
j'ai oublié" un ; sur ksort
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
25 oct. 2012 à 20:00
pour le reste je n'ai pas compris
0
Si $rowA['date_mariage_2'] est le plus petit, je commence mes traitements avec num_cj_2 (champs qui est en rapport avec date_mariage_2).
Si $rowA['date_mariage_1'] est le deuxième dans les plus petit, je continue mes traitements avec num_cj_1.
etc ...............
Comment faire le lien entre les champs date_mariage classés dans l'ordre, et leur correspondant num_cj ?
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 10:11
je pensai t'avoir répondu hier soir mais j'ai encore du cliquer sur créer un nouveau sujet..

il faut revoir ton architecture de db.

crée une table mariage
avec les champs idMembre|date|idConjoint

de cette manière tu pourras récupérer tes données comme ça

SELECT mariage.date,mariage.idConjoint FROM membre,mariage WHERE membre.id = :id && mariage.idMembre = membre.id ORDER BY mariage.date ASC
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 10:12
je ne peux plus répondre au sujet
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 10:12
étrange a chaque fois que je te répond ca me supprime mon message
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 10:13
je vais le faire par petit bout j'en ai marre de réécrire la même chose j'avais répondu hier soir déjà...
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 10:14
Il faut restructurer ta base de donnée parce que ce n'est pas propre de faire comme ça...
si il y a beaucoup de membre ça fait beaucoup de boucle
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 10:17
il faut que tu crée une table mariage
avec les champs idMembre , date , idConjoint
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 10:18
de cette manière tu pourras récupérer tes date dans l'ordre comme dans le prochain message (ca supprime régulièrement c'est compliqué)
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
26 oct. 2012 à 10:54
Je ne peux modifier la base actuelle. Je pourrais éventuellement en créer une deuxième en parallèle, identique, uniquement pour ce traitement. Mais est-ce bien valable ? Et cela entrainerait d'autres complications pour les mises à jour.

Par contre, j'ai testé ton script avec le foreach. GENIAL !!!!!
La seule solution que je vois maintenant, c'est de tester si le premier résdultat (première ligne) correspond à date_mariage_1, date_mariage_2, date_mariage_3 ou date_mariage_4.
Mais comment nommes-tu le premier résultat, le deuxième, ....... Je connaissait $var[0], $var[1], ...... Mais là ? A quoi dois-je comparer $rowA['date_mariage_1'], ..... ?
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 11:36
sinon tu peux les liers des le départ

je te prépare ça mais c'est vraiment pas propre
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 11:43
$rowA = mysql_fetch_array($resultA); 
$a = array();
for($i = 1,isset($rowA['date_mariage_'.$i]),$i++) $a[] = array($rowA['date_mariage_'.$i],$rowA['num_cj_'.$i]);
$b = array(); 
for($i = 0;isset($a[$i]);$i++) { 
	if(empty($a[$i][0])) continue;
	$b[substr($a[$i][0],-4)] = $a[$i]; 
}
unset($a);
ksort($b);

foreach($b as $v) { 
	echo '<p>date :'.$v[0].' conjoint : '.$v[1].'</p>'; 
}
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
26 oct. 2012 à 14:45
J'ai l'erreur Parse error: syntax error, unexpected ',' pour la ligne for($i = ........., et je ne sais pas quoi faire.
J'ai déjà entouré la ligne de ( => for(($i = 1,isset.........'num_cj_'.$i]));
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 17:08
désolé j'ai mis dans , au lieu de ; dans la bouche for
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
26 oct. 2012 à 17:23
Effectivement, cela fonctionne un peu mieux ainsi !
Mais j'ai comme résultat, mes 3 lignes, pour trois mariages :
date :4 FEB 1686 conjoint :
Le numéro du conjoint n'apparait pas. Pourtant il est bien défini dans le script comme num_cj_xx.

Et comment reconnaitre le 1° cjt au 2° ? En faisant quel test ?
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 20:04
$rowA = mysql_fetch_array($resultA); 
$a = array();
for($i = 1,isset($rowA['date_mariage_'.$i]),$i++) $a[] = array($rowA['date_mariage_'.$i],$rowA['num_cj_'.$i]);
$b = array(); 
for($i = 0;isset($a[$i]);$i++) { 
	if(empty($a[$i][0]) || empty($a[$i][1])) continue;
	$b[substr($a[$i][0],-4)] = $a[$i]; 
}
unset($a);
ksort($b);

foreach($b as $v) { 
	echo '<p>date :'.$v[0].' conjoint : '.$v[1].'</p>'; 
}
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
26 oct. 2012 à 20:05
là ca test en plus que conjoint ne soit pas vide

mais après je ne comprend pas je ne peux pas tester le code que je t'envoi

il faut drait que me montre le contenu de $rowA au complet pour ça
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
27 oct. 2012 à 11:20
Le résultat est très bien. Pour un id, j'ai autant de ligne que de mariage avec date et conjoint associé. Et classé dans l'ordre ASC !!!! Merciiiiiiiiiiii ;o)
Maintenant, je veux utiliser le premier conjoint (s'il existe) pour faire un traitement. Ensuite, j'utiliserais le 2°, s'il existe, ......
Comment repérer le premier, deuxième, troisième et quatrième conjoint dans ton script pour tester s'ils existent ?
Pour le contenu de $rowA :
$selectA = 'SELECT date_mariage_1,date_mariage_2,date_mariage_3,date_mariage_4, num_cj_1, num_cj_2, num_cj_3, num_cj_4 FROM ville_bis WHERE id LIKE "'.$id.'" ';
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
27 oct. 2012 à 11:32
pourquoi tu ne peux pas restructurer ta db ?
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
27 oct. 2012 à 11:39
J'ai 46000 individus dans ma db, et je ne voudrais pas tout mélanger ...........
Et d'ailleurs, je ne sais pas comment faire !!!!!
C'est risqué !
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
27 oct. 2012 à 14:14
46000 individu raison de plus pour changer l'architecture !

tu peux le faire sans détruire ton ancienne base et les calculs de se genre ne seront plus un problème
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
27 oct. 2012 à 14:19
c'est vrai que ça peut être compliqué mais en générale les champs1 champs2 etc c'est mauvais

c alourdi tout les traitements
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
Modifié par t671 le 27/10/2012 à 14:44
Mais dans ton script, il n'y a pas moyen d'extrauire le premier résultat, puis le deuxième .....
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
27 oct. 2012 à 16:25
surement mais je ne comprend pas exactement ou tu veux en venir et faire les choses par étape comme ça c'est chiant.
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
27 oct. 2012 à 18:22
OK !
$selectA = 'SELECT date_mariage_1,date_mariage_2,date_mariage_3,date_mariage_4, num_cj_1, num_cj_2, num_cj_3, num_cj_4 FROM ville_bis WHERE id LIKE "'.$id.'" ';

Dans ma requête SELECT, id représente un individus.
date_mariage_1,date_mariage_2,date_mariage_3,date_mariage_4 représentent les dates de son ou ses mariages.
num_cj_1, num_cj_2, num_cj_3, num_cj_4 représentes son ou ses conjoints.
Avec ses renseignements, je construit un arbre généalogique.
J'ai une case qui correspond à l'individu. A côté, une case par conjoint avec la date du mariage.
Donc je veux mettre les mariages dans l'ordre, car dans la base, ils ont été enregistrés au fur et à mesure de leur découverte, et pas forcément dans l'ordre .....
Dis-moi si je suis assez clair ....... :o)
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
27 oct. 2012 à 18:52
c'est ce que ca fait là non ?
0
Tout à fait, mais comment extraire le premier conjoint (donc avec la date de mariage minimum) pour l'afficher ?
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
Modifié par Atropa le 27/10/2012 à 19:00
en ajoutant encore une boucle...

$rowA = mysql_fetch_array($resultA); 
$a = array();
for($i = 1,isset($rowA['date_mariage_'.$i]),$i++) $a[] = array($rowA['date_mariage_'.$i],$rowA['num_cj_'.$i]);
$b = array(); 
for($i = 0;isset($a[$i]);$i++) { 
	if(empty($a[$i][0]) || empty($a[$i][1])) continue;
	$b[substr($a[$i][0],-4)] = $a[$i]; 
}
ksort($b);
$a = array();
foreach($b as $v) $a[] = $v;

var_dump($a);
0
t671 Messages postés 1462 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 21 décembre 2024 11
29 oct. 2012 à 17:13
Merci Atropa. Mais je ne vois pas comment je peux exploiter le résultat !?
array(3) { [0]=> array(2) { [0]=> string(17) "Avant 16 DEC 1685" [1]=> string(4) "4603" } [1]=> array(2) { [0]=> string(10) "4 FEB 1686" [1]=> string(3) "868" } [2]=> array(2) { [0]=> string(10) "3 OCT 1701" [1]=> string(4) "3361" } }
J'ai bien mes trois mariages : string(17) et 2xstring(10). Et j'ai bien mes 3 conjoints 2xstring(4) et string (3).
Mais je ne sais pas comment faire avec cela !!!!!!

J'ai repensé à ta proposition de remodeler la bd. Ou plutôt d'en créer une deuxième avec les individus + date mariage + conjoint.
Donc ce serait 1 enregistrement = 1 mariage ?
En sachant que dans ma base actuelle, un enregistrement comprend un individu, ses dates de mariages (de 0 à 4), ses conjoints (de 0 à 4), plus d'autres renseignements (père, mère, date_dc.......).
Comment récupérer l'individu, et créer autant d'enregistrement qu'il y a de mariage ?
0
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
29 oct. 2012 à 17:23
excuse moi mais tu sais coder en php ?

sinon pour tes bases de données oui une nouvelle table a chaque fois qu'il y a plusieurs éléments pour un même individu

père mère on en a qu'un et ca ne changera jamais donc un champ suffit

mariage on peut en avoir plusieurs pareil pour les enfants donc une table mariage,une table enfant etc
0