Trier des dates dans l'ordre

t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   -  
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   274
 
tu veux trier les dates dans l'ordre pour une ligne ou pour toutes les lignes ?
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
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   Statut Membre Dernière intervention   83
 
il manque un bout de ton message je pense ;)
0
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
non même pas...
0
Blunderer Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   83
 
Ah non j'avais mal compris ton message ;) dsl
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
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 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
j'ai oublié" un ; sur ksort
0
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
pour le reste je n'ai pas compris
0
t671
 
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   Statut Membre Dernière intervention   274
 
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   Statut Membre Dernière intervention   274
 
je ne peux plus répondre au sujet
0
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
étrange a chaque fois que je te répond ca me supprime mon message
0
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
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   Statut Membre Dernière intervention   274
 
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   Statut Membre Dernière intervention   274
 
il faut que tu crée une table mariage
avec les champs idMembre , date , idConjoint
0
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
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 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
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   Statut Membre Dernière intervention   274
 
$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 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
désolé j'ai mis dans , au lieu de ; dans la bouche for
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
$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   Statut Membre Dernière intervention   274
 
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 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
pourquoi tu ne peux pas restructurer ta db ?
0
t671 Messages postés 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
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   Statut Membre Dernière intervention   274
 
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 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
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 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
c'est ce que ca fait là non ?
0
t671
 
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   Statut Membre Dernière intervention   274
 
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 1476 Date d'inscription   Statut Membre Dernière intervention   11
 
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   Statut Membre Dernière intervention   274
 
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