Afficher par ordre croissant données de 3 tables

bobi
Invité n'ayant pas de compte PHPfrance

27 oct. 2009, 11:26

Bonjour,

J'ai actuellement 3 tables différentes qui n'ont aucun rapport les unes avec les autres. De ces 3 tables, je voudrais récupérer chaque dernier enregistrement et les afficher sur une page par ordre croissant. Je ne vois pas trop comment m'y prendre étant qu'il s'agit de 3 tables différentes avec 3 requêtes différentes.

Par exemple : T1 - T2 et T3 pour mes 3 tables. E1 - E2 et E3 pour les 3 derniers enregistrement de chaque table.

le 27/10 j'ai une nouvelle donnée sur T1
le 28/10 une nouvelle sur T3
le 29 une nouvelle sur T2.

Comment afficher :
1. E2
2. E3
3. E1

Merci pour votre aide

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 oct. 2009, 11:38

Si tu utilises MySQL tu peux utiliser LIMIT pour récupérer la dernière ligne de chaque table (résultats triés par ordre chronologique décroissant, tu prends le premier)

Ensuite, tu peux trier ces 3 lignes via PHP. Si tu mets ces lignes dans un tableau, tu peux transformer la date en timestamp UNIX par exemple, avec mktime, et trier sur cet entier.

3 petites requêtes simples et un petit tri rapide par PHP sont à mon avis meilleures qu'une seule grosse requête compliquée, mais tu pourrais aussi concaténer le résultat des 3 requêtes avec UNION et rajouter un tri sur cette requête globale.

bobi
Invité n'ayant pas de compte PHPfrance

28 oct. 2009, 10:19

Merci pour ton aide ouckileou ;)

Alors j'ai réussi à intégrer dans mon tableau les informations provenant de 2 requêtes.
$sql=mysql_query("SELECT id,email,date_insc FROM tab1 ORDER BY id DESC LIMIT 0,1");
$rs = mysql_fetch_object ( $sql );

$sql1=mysql_query("SELECT id,auteur,date FROM tab2 ORDER BY id DESC LIMIT 0,1");
$rs1 = mysql_fetch_object ( $sql1 );

$data[] = $rs->id;
$data[] = $rs->email;
$data[] = $rs->date_insc;
$data[] = $rs1->id;
$data[] = $rs1->auteur;
$data[] = $rs1->date;

print_r($data);
J'ai regardé la doc pour le tri, mais je ne vois pas du comment trier à partir de la date, ici à savoir vérifier date_insc et date :|

Merci !

Eléphant du PHP | 86 Messages

28 oct. 2009, 11:33

Bonjour,

En imaginant que ta date soit enregistrée au format timestamp dans ta base tu dois faire un truc du genre :
<?php
    $data = array();
    
    $sql=mysql_query("SELECT id,email,date_insc FROM tab1 ORDER BY id DESC LIMIT 0,1");
    $rs = mysql_fetch_object ( $sql );

    $sql1=mysql_query("SELECT id,auteur,date FROM tab2 ORDER BY id DESC LIMIT 0,1");
    $rs1 = mysql_fetch_object ( $sql1 );

    $data[$rs->date_insc][] = array("id" => $rs->id, "email" => $rs->email);
    $data[$rs1->date][] = array("id" => $rs1->id, "email" => $rs1->auteur);

    ksort($data);
    
    print_r($data);
?>
Si les dates ne sont pas enregistrées au format timestamp il te suffit de les transformer avec un petit "mktime();".

bobi
Invité n'ayant pas de compte PHPfrance

29 oct. 2009, 10:10

Merci beaucoup !

J'arrive maintenant à afficher toutes les données et à les trier selon la date. Le hic c'est que je voudrais sélectionner des champs précis et afficher des choses différentes selon chaque table.
$sql=mysql_query("SELECT id,intitule,url,date_insc,quoineuf FROM tab1 ORDER BY id DESC LIMIT 0,1");
$rs = mysql_fetch_object ( $sql );

$sql1=mysql_query("SELECT id,auteur,objectif,date,quoineuf FROM tab2 ORDER BY id DESC LIMIT 0,1");
$rs1 = mysql_fetch_object ( $sql1 );

$sql2=mysql_query("SELECT id_video,titre,auteur,date_ajout,quoineuf FROM tab3 ORDER BY id_video DESC LIMIT 0,1");
$rs2 = mysql_fetch_object ( $sql2 );

$data[strtotime($rs->date_insc)][$rs->quoineuf][] = array("id" => $rs->id, "intitule" => $rs->url, "url" => $rs->url, "date_insc" => date("d.m.Y",strtotime($rs->date_insc)));

$data[strtotime($rs1->date)][$rs1->quoineuf][] = array("id" => $rs1->id, "objectif" => $rs1->objectif, "auteur" => $rs2->auteur, "date" => date("d.m.Y",strtotime($rs1->date)));

$data[$rs2->date_ajout][$rs2->quoineuf][] = array("id_video" => $rs2->id_video, "titre" => $rs2->titre, "auteur" => $rs2->auteur, "date_ajout" => date("d.m.Y",$rs2->date_ajout));

ksort($data);
//print_r($data);

foreach($data as $keyLevel_1 => $dataLevel_1) 
{
    foreach($dataLevel_1 as  $keyLevel_2 => $dataLevel_2)
    {
	print "<strong>".$keyLevel_2."</strong><br />";
	 foreach($dataLevel_2 as  $keyLevel_3 => $dataLevel_3)
        {
		foreach($dataLevel_3 as  $keyLevel_4 => $dataLevel_4)
	        {
				print "$keyLevel_4 : ".$dataLevel_4;
	        }
		echo '<br />';
        }
    }
}
Là j'affiche tout avec print "$keyLevel_4 : ".$dataLevel_4;. Y a t-il un moyen de voir de quelle table provient chaque donnée et faire un affichage en conséquence ?

Par exemple au lieu de faire un print comme ça, peut-on faire :

Si ces données viennent de tab 1 alors afficher les champs qu'on veut de tab1.
Si ces données viennent de tab 2 alors afficher les champs qu'on veut de tab2.
Si ces données viennent de tab 3 alors afficher les champs qu'on veut de tab3.

Merci !