2010-06-03 16 views
4

J'ai 2 tables. L'un est pour les catégories, le second est pour les questions. Comment puis-je boucler tous les noms de catégorie et afficher les questions regroupées sous chaque nom de catégorie? En utilisant ColdFusion, je suppose que je devrais utiliser <CFLOOP>Utilisation de requêtes cfloop imbriquées

Les résultats devraient ressembler à ceci.

Category1

  • Question 1
  • Question 2

Categorie2

  • Question 4
  • Question 5

Répondre

10

Si vous bouclez avec cfoutput, vous pouvez regrouper par une colonne spécifique, puis avoir une boucle interne pour les éléments de cette colonne.

Comme ceci:

<cfquery name="Questions"> 
    SELECT q.question_name , c.category_name 

    FROM questions q 
    JOIN category c 
     ON c.category_id = q.category_id 

    ORDER BY c.category_name , q.question_name 
</cfquery> 

<cfoutput query="Questions" groupby="category_name"> 
    **#category_name#** 
    <cfoutput> 
     #question_name# 
    </cfoutput> 
</cfoutput> 


Fâcheusement, cette fonction de groupement n'a pas été ajouté à la principale cfloop, vous devez l'utiliser via cfoutput. :(

Mise à jour: Dans ColdFusion 10 et Railo 4, vous pouvez le faire avec cfloop plutôt que cfoutput A noter cependant que l'attribut est groupe pas groupby.

<cfloop query="Questions" group="category_name"> 
    **#category_name#** 
    <cfloop> 
     #question_name# 
    </cfloop> 
</cfloop> 


Important: S'il s'agit d'une sortie HTML, utilisez HtmlEditFormat(question_name) pour éviter une injection HTML potentielle. Injection JS, etc.

Encore une fois, les deux CF10/R4 ont également amélioré cette situation, avec des méthodes plus souvent appelées encodeForX (c.-à-d. encodeForHtml, encodeForJavaScript, etc)

+0

Comment pourrais-je structurer la boucle comme votre exemple? – jeff

+0

@jeff, qu'est-ce que tu veux dire? cfoutput boucle déjà la requête pour vous. – Henry

+1

btw, n'oubliez pas d'utiliser htmlEditFormat() entre ##. :) – Henry