3 tables en une seule requête

Résolu
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 !

2 réponses

  1. 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
    1. Merci beaucoup, j'avais penser à un array mais je connaissais pas celui-ci. Je vais essayer ça tout de suite !
      0
    2. 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
    3. Un array c'est un tableau. Un tableau peut contenir une infinité de valeur.
      0
    4. Plusieurs valeur par entrée ??
      0
  2. 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
    1. 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
    2. 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
    3. 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
    4. 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
    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