Trier des dates dans l'ordre

t671 Messages postés 1478 Date d'inscription   Statut Membre Dernière intervention   -  
t671 Messages postés 1478 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

  • 1
  • 2
Résumé de la discussion

Un enregistrement contient quatre champs date_mariage_1 à date_mariage_4, parfois vides et dans un ordre quelconque, et l’objectif est de les trier par année en s’appuyant sur les quatre derniers caractères de chaque date. Parmi les solutions proposées, un tri basé sur les années extraites par Right(date_mariage_x, 4) est suggéré, avec une logique pour ignorer les champs vides et associer chaque date à son identifiant conjoint. D'autres propositions explorent le tri côté base (ORDER BY RIGHT(date_mariage_x,4)) et le maintien du lien avec les num_cj correspondants, tout en évoquant des difficultés liées à des erreurs de syntaxe et à la validation des données.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. Atropa Messages postés 2051 Statut Membre 274
     
    tu veux trier les dates dans l'ordre pour une ligne ou pour toutes les lignes ?
    0
  2. t671 Messages postés 1478 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
  3. Atropa Messages postés 2051 Statut Membre 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
    1. Blunderer Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   83
       
      il manque un bout de ton message je pense ;)
      0
    2. Atropa Messages postés 2051 Statut Membre 274
       
      non même pas...
      0
    3. Blunderer Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   83
       
      Ah non j'avais mal compris ton message ;) dsl
      0
  4. t671 Messages postés 1478 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Atropa Messages postés 2051 Statut Membre 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
  7. t671 Messages postés 1478 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
  8. Atropa Messages postés 2051 Statut Membre 274
     
    j'ai oublié" un ; sur ksort
    0
    1. Atropa Messages postés 2051 Statut Membre 274
       
      pour le reste je n'ai pas compris
      0
  9. 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
  10. Atropa Messages postés 2051 Statut Membre 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
  11. Atropa Messages postés 2051 Statut Membre 274
     
    je ne peux plus répondre au sujet
    0
    1. Atropa Messages postés 2051 Statut Membre 274
       
      étrange a chaque fois que je te répond ca me supprime mon message
      0
    2. Atropa Messages postés 2051 Statut Membre 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
    3. Atropa Messages postés 2051 Statut Membre 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
    4. Atropa Messages postés 2051 Statut Membre 274
       
      il faut que tu crée une table mariage
      avec les champs idMembre , date , idConjoint
      0
    5. Atropa Messages postés 2051 Statut Membre 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
  12. t671 Messages postés 1478 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
    1. Atropa Messages postés 2051 Statut Membre 274
       
      sinon tu peux les liers des le départ

      je te prépare ça mais c'est vraiment pas propre
      0
    2. Atropa Messages postés 2051 Statut Membre 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
  13. t671 Messages postés 1478 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
    1. Atropa Messages postés 2051 Statut Membre 274
       
      désolé j'ai mis dans , au lieu de ; dans la bouche for
      0
  14. t671 Messages postés 1478 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
  15. Atropa Messages postés 2051 Statut Membre 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
    1. Atropa Messages postés 2051 Statut Membre 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
  16. t671 Messages postés 1478 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
    1. Atropa Messages postés 2051 Statut Membre 274
       
      pourquoi tu ne peux pas restructurer ta db ?
      0
  17. t671 Messages postés 1478 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
    1. Atropa Messages postés 2051 Statut Membre 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
    2. Atropa Messages postés 2051 Statut Membre 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
  18. t671 Messages postés 1478 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
    1. Atropa Messages postés 2051 Statut Membre 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
  19. t671 Messages postés 1478 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
    1. Atropa Messages postés 2051 Statut Membre 274
       
      c'est ce que ca fait là non ?
      0
  20. t671
     
    Tout à fait, mais comment extraire le premier conjoint (donc avec la date de mariage minimum) pour l'afficher ?
    0
    1. Atropa Messages postés 2051 Statut Membre 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
  21. t671 Messages postés 1478 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
    1. Atropa Messages postés 2051 Statut Membre 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
  • 1
  • 2