2010-01-01 5 views
3

J'ai 2 tables. Une table est 'en-têtes' & contient des titres et l'autre est 'sous-titres' et contient des sous-titres qui sont (& doivent être) classés sous les rubriques et doivent avoir un titre respectif. Un sous-titre peut avoir un seul titre et de nombreux sous-titres peuvent avoir le même titre. Considérons donc le format suivant:Echo PHP Répétition des lignes une seule fois

--Table heading 

heading_id heading 
1   H1 
2   H2 
3   H3 


--Table sub_heading 

sub_head_id sub_heading heading_id 
1   SH1    1 
2   SH2    1 
3   SH3    2 
4   SH4    3 
5   SH5    2 
6   SH6    4 

Ce que je voudrais faire est d'interroger la base de données qu'une seule fois et obtenir toutes sub_headings et leurs rubriques correspondantes (en utilisant Inner Join?) Et la sortie un en-tête une seule fois et la liste de tous les sub_headings énumérés sous leur titre respectif. Ainsi, dans la pratique, je voudrais montrer le RÉSULTAT DE LA SORTIE EN:

H1 
--SH1 
--SH2 

H2 
--SH3 
--SH5 

H3 
--SH4 

H4 
--SH6 

Comme vous pouvez le voir, les titres sont echo'ed qu'une seule fois et toutes les sous-titres qui appartiennent à une rubrique sont joliment montré sous leur titre respectif. Donc, je voudrais savoir quelle requête je voudrais écrire pour le faire.

REMARQUE: J'ai déjà écrit un code pour extraire heading_id et, ce faisant, dans une boucle, interrogez la base de données pour les sous-titres respectifs. Cela entraîne à nouveau une boucle des sous-têtes. Mais (j'en ai l'impression) l'inconvénient est que pour chaque titre existant, la base de données sera interrogée au moins une fois pour obtenir les sous-titres correspondants. Donc, si 50 vedettes existent, en les récupérant dans une boucle, une deuxième requête est effectuée pour obtenir les sous-titres. Cela nécessite que j'écrive une deuxième requête pour obtenir les sous-titres et les traiter en boucle. Je veux éviter cela.

Donc, il serait vraiment utile si quelqu'un peut me dire comment interroger la DB une seule fois et afficher le résultat comme indiqué ci-dessus. Merci d'avance.

Répondre

3
$query = "SELECT 
    h.heading, 
    s.sub_heading 
FROM 
    heading h 
LEFT JOIN 
    sub_heading s 
ON 
    h.id = s.heading_id 
ORDER BY 
    s.heading_id ASC, 
    s.sub_head_id ASC"; 

$resource = mysql_query($query); 

$previous_heading = false; 

// This will print the headings in a unordered list, modify if needed 
echo '<ul>'; 
while($resource = mysql_fetch_assoc($resource)) { 
    if(!$previous_heading || $previous_heading != $resource['heading']) { 
     if($previous_heading) { 
      echo '</ul></li>'; 
     } 
     echo '<li>'.$resource['heading'].'<ul>'; 
    } 
    echo '<li>'.$resource['sub_heading'].'</li>'; 
    $previous_heading = $resource['heading']; 
} 
echo '</ul></ul>'; 

Affichera quelque chose comme

  • H1
    • SH1
    • SH2
  • H2
    • SH3
    • SH5
  • H3
    • SH4
  • H4
    • SH6
+0

IMPRESSIONNANT! Travaillé parfaitement! Merci beaucoup. – Devner

+0

@Tatu, il vous manque une virgule mon ami, dans votre requête. Il aurait dû être: s.heading_id ASC, s_head_id ASC Corrections mineures, mais peuvent aider quelqu'un dans le futur. – Devner

+0

@Devner, merci de le signaler. –

3
select * 
from heading h, subheading s 
where s.h = h.id 
order by h.title, s.title 
boucle

sur le résultat et lorsque les changements heading_id, la sortie d'une nouvelle section

+0

Merci pour votre commentaire. Vous avez raison sur la boucle, mais en fait j'avais besoin du code pour faire ce que l'autre utilisateur (Tatu) a fourni. J'apprécie vos efforts pour répondre à ma question. – Devner