Skip to main content
Inspiring
December 21, 2016
Question

CFOUTPUT query from CFOUTPUT query

  • December 21, 2016
  • 2 replies
  • 1806 views

Bonjour,

Je voudrais faire un query d'un autre query.

Exemple :

J'ai 2 tables : une des pays et une des villes de ces pays

France : Paris Marseille Lyon

Allemagne : Berlin Cologne

Italie : Rome Milan

Je voudrais pouvoir choisir dans un 1er query les pays, dans le 2ème les villes du pays choisi.

Exemple bienvenu

Merci pour votre aide.

    This topic has been closed for replies.

    2 replies

    ZNBAuthor
    Inspiring
    January 12, 2017

    Bonjour,

    Voici votre script remanié :

    <!--- created by WolfShade in ColdFusion  --->

    <!--- Dans un répertoire vierge, pour les tests, procédez comme suit : --->

    <!--- selects.htm --->
    <html>
    <head>   
    <title>My Page</title>   
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!--- jQuery doit être chargé avant la balise html de fermeture; Je le garde ici pour plus de simplicité --->   
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    </head>

    <body>   
    <!--- La première sélection est le code statique, mais vous pouvez le créer à partir d'une requête, ainsi ---> 
    <form>     
      <select id="country">           
       <option value="0">-- Select a Country --</option>           
       <option value="1">France</option>           
       <option value="2">Germany</option>           
       <option value="3">Italy</option>       
      </select>            
      <!--- Laissez la deuxième sélection sans options; JQuery lui donnera des options lorsque le premier select change --->       
      <select id="city">           
       <option>-- Select a City --</option>      
      </select>   
    </form>
    <!--- Incluez un fichier .js qui contient votre code jQuery et AJaX --->
    <script src="app.js"></script>   
    </body>
    </html>

    app.js
    $(document).ready(function() {         $country= $("#country");    $city = $("#city");         $country.on("change", function(e) {        var country = $(this).val();
            // Pays est un tableau, le convertir en une liste
            country = country.join(',');         //always clear //toujours clair        $city.empty();        //reinject the default //réinitialiser la valeur par défaut        $city.append("<option value=''>-- Select a City --</option>");        //if blank, do nothing        if(state === 0) return;        $.getJSON("service.cfc?method=getCities", {country:country}).done(function(res) {            for(var i=0, len=res.length; i<len; i++) {                $city.append("<option value='"+res.CITY+"'>"+res.CITY+"</option>");            }        });    });    });

    <!--- service.cfc contiendra une fonction appelée "getCities" qui a un argument, une valeur, "country".
    Créer une requête à l'intérieur de la fonction qui prend la valeur qui lui est passée et on obtient toutes les villes où le pays est égal à cette valeur retournée par cette requête. --->

    Je ne sais que faire avec la dernière partie.

    Merci par avance

    WolfShade
    Legend
    January 17, 2017

    Create a CFC (ColdFusion component) called 'service.cfc' that has a CFFUNCTION called 'getCities'.

    Inside getCities, accept the parameter 'country' and use that to query the database for cities of that country, and CFRETURN the data.  I cannot remember, however, if it needs to return a query object, or a JSON object.  I think you should return a JSON object of the query data.  But the AJaX will populate the second SELECT based upon that data.

    Créez un CFC (composant ColdFusion) appelé 'service.cfc' qui a un CFFUNCTION appelé 'getCities'.

    À l'intérieur de getCities, acceptez le paramètre 'country' et utilisez-le pour interroger la base de données pour les villes de ce pays, et CFRETURN les données. Je ne me souviens pas, cependant, s'il doit retourner un objet de requête, ou un objet JSON. Je pense que vous devriez retourner un objet JSON des données de la requête. Mais l'AJaX remplira le second SELECT en fonction de ces données.

    V/r,

    ^_^

    PS  Désolé pour la réponse tardive. Le Mid-West était sous la menace d'une tempête de verglas qui était censée détruire les lignes électriques, donc je n'ai pas été en ligne beaucoup pour les derniers jours. Heureusement, la tempête n'a pas été aussi mauvaise que prévu.

    ZNBAuthor
    Inspiring
    January 18, 2017

    Désolé mais jamais fait de CFC[ ]

    Cordialement

    Jean-Marie

    WolfShade
    Legend
    December 21, 2016

    Bonjour, ZNB​,

    What you describe is an inefficient way of doing what you are asking for.  Putting a query loop within a query loop is resource intensive.  I will attempt to show you the method that you ask, and then I will follow that with what I believe would be a better way of aggregating the data you seek.

    <cfquery name='country' datasource='#application.dsn#'>

       SELECT country

       FROM countries

       ORDER BY country ASC

    </cfquery>

    <cfoutput query='country'>

    #country.country#<br />

    <cfquery name='city' datasource='#application.dsn#'>

      SELECT city

      FROM cities

      WHERE country = <cfqueryparam value="#country.country#' />

    </cfquery>

    <cfoutput query='city'>

    - #city.city#<br />

    </cfoutput>

    </cfoutput>

    Now for what I consider a much better approach.

    <cfquery name='country_city' datasource='#application.dsn#'>

      SELECT a.country, b.city

      FROM country a LEFT OUTER JOIN city b ON b.country = a.country

      ORDER BY a.country ASC, b.city ASC

    </cfquery>

    <cfoutput query='country_city' group='country'>

    #country_city.country#<br />

    <cfoutput>

    - #country_city.city#<br />

    </cfoutput>

    </cfoutput>

    This takes a single query, aggregates the data as you want it, and displays it quickly and efficiently, without looped database connection/disconnections, etc.

    HTH,

    ^_^

    ZNBAuthor
    Inspiring
    December 21, 2016

    Merci pour votre réponse !

    Mais je me rends compte que j'ai compliqué le script en faisant 2 tables.

    Est-il possible de faire qu'une table avec une colonne Pays et une colonne ville et faire la même chose ?

    Merci par avance

    Cordialement

    WolfShade
    Legend
    December 21, 2016

    You can put all the data into one table, yes.  But the best practice is to put countries and cities into separate tables.  It's a way of normalizing the data to reduce size.  If you have one table that has countries and cities, then the country names are being repeatedly used, over and over, taking up space that would be saved by using two tables - one table for country, one table for city with a reference ID to the country table.

    Vous pouvez mettre toutes les données dans une table, oui. Mais la meilleure pratique est de mettre les pays et les villes dans des tableaux distincts. C'est un moyen de normaliser les données pour réduire la taille. Si vous avez une table qui a des pays et des villes, puis les noms de pays sont utilisés à plusieurs reprises, encore et encore, en prenant l'espace qui serait sauvé en utilisant deux tables - une table pour le pays, une table pour la ville avec un ID de référence La table de pays.

    V/r,

    ^_^