3 tables en une seule requête

Résolu
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   -  
Meoran Messages postés 1562 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Sur la page d'accueil de mon site, je souhaite afficher les 10~15 derniers ajouts, c'est-à-dire les dernières articles, les dernière nouvelles et les dernières revues. Ces trois derniers sont stockés dans 3 tables différentes, organisé ainsi : http://img4.hostingpics.net/pics/7024193tables.jpg

Peut importe si le nombre de nouvelles soit supérieur aux nombres de nouvelles et de revues (et réciproquement), je souhaite simplement afficher les derniers parus, selon leurs timestamps.


Merci d'avance !
A voir également:

2 réponses

Meoran Messages postés 1562 Date d'inscription   Statut Membre Dernière intervention   207
 
Salut,

le mieux est de faire trois requêtes différentes et de regrouper ensuite les résultats en php avec array_merge.

Puis de trier le tableau par date, et de prendre les 15 derniers ;)
1
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   5
 
Merci beaucoup, j'avais penser à un array mais je connaissais pas celui-ci. Je vais essayer ça tout de suite !
0
Meoran Messages postés 1562 Date d'inscription   Statut Membre Dernière intervention   207
 
array_merge() est une fonction de fusion de tableau !

https://www.php.net/manual/fr/function.array-merge.php
0
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   5
 
Seulement, un array ne peut contenir qu'une valeur, non ? Dans tous les cas, si je créé un array pour chaque table, les données seront différentes !
0
Meoran Messages postés 1562 Date d'inscription   Statut Membre Dernière intervention   207
 
Un array c'est un tableau. Un tableau peut contenir une infinité de valeur.
0
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   5
 
Plusieurs valeur par entrée ??
0
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   5
 
Voilà ce que j'ai fais :
    $article = array (); 
    $i = 0; 
     
    $reponse = mysql_query('SELECT * FROM article ORDER BY id DESC LIMIT 0,10'); 
     
    while($données = mysql_fetch_array($reponse)) 
    { 
     $article[$i][0] = "article"; 
     $article[$i][1] = $données['id']; 
     $article[$i][1] = $données['titre']; 
     $article[$i][3] = $données['timestamp']; 
     $article[$i][4] = $données['texte']; 
     $article[$i][5] = $données['auteur']; 
      
     $i++; 
    } 
     
    $nouvelle = array (); 
    $i = 0; 
     
    $reponse = mysql_query('SELECT * FROM nouvelle ORDER BY id DESC LIMIT 0,10'); 
     
    while($données = mysql_fetch_array($reponse)) 
    { 
     $nouvelle[$i][0] = "nouvelle"; 
     $nouvelle[$i][1] = $données['id']; 
     $nouvelle[$i][1] = $données['titre']; 
     $nouvelle[$i][3] = $données['timestamp']; 
     $nouvelle[$i][4] = $données['contenu']; 
      
     $i++; 
    } 
     
    $revue = array (); 
    $i = 0; 
     
    $reponse = mysql_query('SELECT * FROM revue ORDER BY id DESC LIMIT 0,10'); 
     
    while($données = mysql_fetch_array($reponse)) 
    { 
     $revue[$i][0] = "revue"; 
     $revue[$i][1] = $données['id']; 
     $revue[$i][1] = $données['numero']; 
     $revue[$i][3] = $données['parution']; 
     $revue[$i][6] = $données['titre']; 
     $revue[$i][7] = $données['prix']; 
     $revue[$i][8] = $données['nom_couverture']; 
     $revue[$i][9] = $données['nom_sommaire']; 
     $revue[$i][10] = $données['parution']; 
      
     $i++; 
    } 
     
    $array_trois_tables = array_merge($article, $nouvelle, $revue); 


Maintenant, comment lister les entrées une par une ? J'ai essayer de faire avec foreach mais je sais pas exactement comment faire. Ensuite, on peut voir une la première valeur des entrées est soit "article", soit "nouvelle" ou soit "revue", est-il possible de faire comme ceci :

fonction_qui_liste
{
Si (valeur 1 == "article")
{
Instruction : Faire cette mise-en-page
}
Si (valeur 1 == "revue")
{
Instruction : Faire cette mise-en-page
}
Si (valeur 1 == "nouvelle")
{
Instruction : Faire cette mise-en-page
}
}
0
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   5
 
Pour afficher, j'ai trouver:
    $tableau_trois_tables = array_merge($article, $nouvelle, $revue); 
     
    $nombre_entree = count($tableau_trois_tables); 
     
    echo $nombre_entree; 
    for($i=0;$i!=$nombre_entree;$i++) 
    { 
     $type = $tableau_trois_tables[$i][0]; 
     if($type == "article") 
     { 
      echo "Ahah"; 
     } 
     if($type == "nouvelle") 
     { 
      echo "Ouhouh"; 
     } 
     if($type == "revue") 
     { 
      echo "hihi"; 
     } 
    } 


Maintenant, comment trier le tableau $tableau_trois_tables selon les timestamps contenu dans la colonne 3 ($tableau_trois_tables[$i][3]) ?
0
Meoran Messages postés 1562 Date d'inscription   Statut Membre Dernière intervention   207
 
Re,

pour trier ton tableau :

foreach ($tableau_trois_tables as $key => $row) {
$date[$key] = $row[$key][3];
}

array_multisort($date, SORT_DESC, $tableau_trois_tables);

Pas sur que ça marche à cause de $row[$key][3], mais essaye quand même. Il peut également y avoir des problèmes de tri parce que c'est des dates.

Fais ensuite un print_r($tableau_trois_tables) et dis moi s'il est bien trié.
0
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   5
 
Bonjour, merci encore pour ton aide !

J'obtiens "Notice: Undefined offset" pour la ligne du $date[$key] = $row[$key][3]; et ça autant de fois que le nombre d'entrée du $tableau_trois_tables.

Avec un print_r($tableau_trois_tables), on peut voir que le tableau n'est absolument pas classé.

Effectivement, la table "revue" ne possède pas de timestamp mais je vais en ajouter un, parce que là $données['parution'] affiche soit Printemps 20** soit Automne 20**.
0
Meoran Messages postés 1562 Date d'inscription   Statut Membre Dernière intervention   207
 
Oui il faut absolument que les [$i][3] soit tous du même type !

Autrement il est toujours possible de formater le format reçu en un format standard mais bon, ça fait un algo de plus, et c'est pas forcément nécessaire alors que tu peux directement le faire dans la bd.

Je creuse le problème et je t'en reparle un peu plus tard, je suis au taf là ^^
0
crocoscore Messages postés 165 Date d'inscription   Statut Membre Dernière intervention   5
 
Ok, je vais modifier ajouter un timestamp à chacune de mes entrée de la table revue. J'en ai pour un petit moment, je passerai demain ou après demain
0