3 tables en une seule requête

Résolu/Fermé
crocoscore Messages postés 165 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 - Modifié par crocoscore le 16/06/2011 à 14:56
Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 - 21 juin 2011 à 13:22
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

Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 204
Modifié par Meoran le 16/06/2011 à 15:30
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 5
16 juin 2011 à 15:35
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 vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 204
16 juin 2011 à 15:36
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 5
16 juin 2011 à 15:46
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 vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 204
16 juin 2011 à 15:48
Un array c'est un tableau. Un tableau peut contenir une infinité de valeur.
0
crocoscore Messages postés 165 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 5
16 juin 2011 à 15:51
Plusieurs valeur par entrée ??
0
crocoscore Messages postés 165 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 5
Modifié par crocoscore le 16/06/2011 à 17:39
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 5
Modifié par crocoscore le 16/06/2011 à 21:09
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 vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 204
Modifié par Meoran le 16/06/2011 à 23:25
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 5
Modifié par crocoscore le 17/06/2011 à 11:14
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 vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 204
Modifié par Meoran le 17/06/2011 à 21:23
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 3 février 2015 5
17 juin 2011 à 18:50
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