Copy link to clipboard
Copied
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.
Copy link to clipboard
Copied
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,
^_^
Copy link to clipboard
Copied
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
Copy link to clipboard
Copied
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,
^_^
Copy link to clipboard
Copied
I just realized that I did not completely explain my suggested more efficient method. Assume we have two tables, as such:
TABLE COUNTRY
cid country
1 France
2 Germany
3 Italy
TABLE CITY
city cid
Paris 1
Munchen 2
Nantes 1
Rome 3
Naples 3
Lyon 1
Milan 3
Hanover 2
The suggested query should have contained LEFT OUTER JOIN WHERE b.cid = a.cid so that it would match the country ID in each table. Such a query would result in output like this:
France
- Lyon
- Nantes
- Paris
Germany
- Hanover
- Munchen
Italy
- Milan
- Naples
- Rome
HTH,
^_^
Copy link to clipboard
Copied
Merci
J'avais compris mais pour le plaisir d'apprendre, est-il possible de faire l'affichage du pays puis de la ville avec une seule table ?
Exemple de table :
cid country city
1 France Lyon
2 France Nantes
3 France Paris
4 Germany Hanover
5 Germany Munchen
6 Italy Milan
7 Italy Naples
8 Italy Rome
Merci pour votre implication
Cordialement
Copy link to clipboard
Copied
Yes, all you have to do is use nested CFOUTPUT tags. The primary CFOUTPUT tag would use the GROUP attribute, and the nested tag would use no attributes.
Oui, tout ce que vous avez Ć faire est d'utiliser des tags CFOUTPUT imbriquĆ©s. La balise CFOUTPUT primaire utiliserait l'attribut GROUP et la balise imbriquĆ©e n'utiliserait aucun attribut.
<cfquery name='country_city' datasource='#application.dsn#'>
SELECT cid, country, city
FROM table_country_city
ORDER BY country ASC, city ASC
</cfquery>
<cfoutput query='country_city' group='country'>
#country_city.country#<br />
<cfoutput>
- #country_city.city#<br />
</cfoutput><br />
</cfoutput>
One query, nested loops. Not quite as nice as my previous suggestion, for no reason other than I much prefer to normalize data and condense code and use OUTER JOIN whenever possible.
Une requĆŖte, boucles imbriquĆ©es. Pas tout Ć fait aussi agrĆ©able que ma suggestion prĆ©cĆ©dente, pour aucune autre raison que je prĆ©fĆØre beaucoup normaliser les donnĆ©es et condenser le code et utiliser OUTER JOIN chaque fois que possible.
HTH,
^_^
Copy link to clipboard
Copied
Merci ! dans les 2 cas, cela marche TrĆØs trĆØs bien !
Toujours pour apprendre ;-), est-il possible de ne voir la liste des villes que pour le pays choisi, dans un autre select ?
Exemple :
France Lyon
Germany Nantes
Italy Paris
Merci par avance
Copy link to clipboard
Copied
If I understand your query correctly, you would like to have each country in text, and next to it a SELECT of all the associated cities?
Certainly. To modify what I posted, most recently:
Si je comprends bien votre requĆŖte, vous aimeriez que chaque pays soit en texte, et Ć cĆ“tĆ© de lui un SELECT de toutes les villes associĆ©es?
Certainement. Pour modifier ce que j'ai affichƩ, plus rƩcemment:
<cfquery name='country_city' datasource='#application.dsn#'>
SELECT cid, country, city
FROM table_country_city
ORDER BY country ASC, city ASC
</cfquery>
<cfoutput query='country_city' group='country'>
#country_city.country# <select name="citySelect" id="cs_#replace(country_city.country,' ','_','all')#"> <!--- replace space with underscore in country name for the SELECT ID --->
<cfoutput><option value="#country_city.city#">#country_city.city#</option></cfoutput></select><br />
</cfoutput>
HTH,
^_^
PS.. I just re-read your message. Basically, a select of countries that will change the select of cities is basically the same, but more involved. It will include some Javascript or jQuery (but don't load jQuery just for this; use it only if you are already using jQuery.)
Copy link to clipboard
Copied
FOLLOW UP: Raymond Camden wrote a blog on this very subject that might be helpful. It's in English, but you should be able to translate it, easily, with Google Translate.
https://www.raymondcamden.com/2014/05/30/Related-selects-with-multiple-options/
SUIVI: Raymond Camden a Ć©crit un blog sur ce sujet qui pourrait ĆŖtre utile. C'est en anglais, mais vous devriez pouvoir le traduire, facilement, avec Google Translate.
https://www.raymondcamden.com/2014/05/30/Related-selects-with-multiple-options/
V/r,
^_^
Copy link to clipboard
Copied
Bonjour,
En effet, il faut passer par Javascript !
Mais c'est ma limite. Je ne connais pas cette technologie.
J'ai copiĆ© l'ensemble du script et cela ne fonctionne pas š
Tant pis
Cordialement
Copy link to clipboard
Copied
You copied Raymond's script and tried it on your system? I don't mean to sound trite, but are you sure you put Javascript and CFscript in their proper places? (You do say that Javascript is your limit. I assume, then, that you are not that versed in CFscript.) Did you load jQuery before the jQuery code? The jQuery code won't work unless jQuery is loaded first. Were there any error messages, either CF error messages, or Javascript error messages in the browser? I'm curious.
Vous avez copiĆ© le script de Raymond et l'avez essayĆ© sur votre systĆØme? Je ne veux pas paraĆ®tre banal, mais ĆŖtes-vous sĆ»r de mettre Javascript et CFscript Ć leur place? (Vous dites que Javascript est votre limite. Je suppose, alors, que vous n'ĆŖtes pas aussi versĆ© dans CFscript.) Avez-vous chargĆ© jQuery avant le code jQuery? Le code jQuery ne fonctionnera pas Ć moins que jQuery soit chargĆ© en premier. Y at-il eu des messages d'erreur, soit des messages d'erreur des FC, soit des messages d'erreur Javascript dans le navigateur? Je suis curieux.
V/r (avec respect),
^_^
Copy link to clipboard
Copied
Bonjour,
Vous avez parfaitement raison (intuition fƩminine ? ).
Je me suis contentƩ de copier le code !
Je ne connais pas du tout cfscript et la faƧon de le mettre en place. La mĆŖme chose avec JQuery. Je me suis formĆ© tout seul.
De plus, en France, CF est un peu dƩlaissƩ !
Dommage, que vous soyez si loin. J'aurais bien aimƩ prendre des cours avec vous !
Cordialement
Jean-Marie
Copy link to clipboard
Copied
Veuillez indiquer la bonne rƩponse. Merci.
Copy link to clipboard
Copied
AH! Okay. That is most likely the issue.
The way that Raymond coded his example has the inclusion of the jQuery library, first, followed by a hard-coded SELECT that contains the first choices, followed by an empty SELECT with no options, followed by the jQuery code that he wrote. In that code, he is using AJaX to send the choice of the first select to a ColdFusion Component (CFC) which retrieves the values related to that first choice, puts that data into a JSON object, and returns that to the page. AJaX will detect this returned data, clear all options from the second SELECT, and generates the options for that second SELECT from the returned data. There are a lot of steps involved, but it is pretty simple to do, actually. I wish I could provide better instructions, but I am at work and cannot take away too much time from my assigned tasks.
La faƧon dont Raymond a codĆ© son exemple a inclus la bibliothĆØque jQuery, suivie d'un SELECT hard-coded qui contient les premiers choix, suivi d'un SELECT vide sans options, suivi du code jQuery qu'il a Ć©crit. Dans ce code, il utilise AJaX pour envoyer le choix de la premiĆØre sĆ©lection Ć un composant ColdFusion (CFC) qui rĆ©cupĆØre les valeurs associĆ©es Ć ce premier choix, place ces donnĆ©es dans un objet JSON et renvoie celle-ci Ć la page. AJaX dĆ©tecte ces donnĆ©es renvoyĆ©es, efface toutes les options de la seconde SELECT et gĆ©nĆØre les options pour cette seconde SELECT Ć partir des donnĆ©es renvoyĆ©es. Il ya beaucoup d'Ć©tapes impliquĆ©es, mais il est assez simple Ć faire, en fait. J'aimerais pouvoir fournir de meilleures instructions, mais je suis au travail et ne peut pas prendre trop de temps de mes tĆ¢ches assignĆ©es.
V/r,
^_^
Copy link to clipboard
Copied
Merci pour toutes ces explications ... mais insuffisantes pour que je comprenne
Je ne suis aucunement pressƩ !
Si un jour, ...
Cordialement
Jean-Marie
Copy link to clipboard
Copied
I attempted to provide an example based upon Raymond's code, but the Jive platform that Adobe is using for their forum is completely worthless, and turned my code into garbage. I hope you can figure it out.
J'ai essayĆ© de fournir un exemple basĆ© sur le code de Raymond, mais la plateforme Jive qu'Adobe utilise pour son forum est totalement sans valeur, et a transformĆ© mon code en ordures. J'espĆØre que vous pouvez le comprendre.
V/r,
^_^
Copy link to clipboard
Copied
Bonjour,
Merci pour le code que vous m'avez envoyƩ !
J'ai presque tout compris ;-).
Je ne sais oĆ¹ mettre la derniĆØre partie : app.js.
D'autre part, il doit y avoir un fichier type clƩ pays ville ou 2 fichiers type idpays pays et idville ville ?
Merci par avance
Copy link to clipboard
Copied
Le fichier app.js doit ĆŖtre placĆ© au bas de la page, avant le tag de fermeture /body. Mais la chose importante Ć retenir est que le fichier app.js doit aller aprĆØs le code qui charge la bibliothĆØque jQuery.
Si vous utilisez une table pour contenir le pays et la ville, il n'y aura pas besoin d'ID. Toutefois, si vous utilisez des tables distinctes pour le pays et la ville, les deux doivent avoir un ID unique, et le tableau pour la ville aura besoin d'une colonne pour faire rƩfƩrence au pays dans lequel il est.
V/r,
^_^
Copy link to clipboard
Copied
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
Copy link to clipboard
Copied
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.
Copy link to clipboard
Copied
DƩsolƩ mais jamais fait de CFC[ ]
Cordialement
Jean-Marie
Copy link to clipboard
Copied
I had a thought that you may not be familiar with CFC, immediately after I submitted my response.
I do not know how much ColdFusion experience you have, but CFC files are pretty easy to learn. While it is typical to place CFC files in a /components folder, you can place the CFC within the same folder as the CFM file that is calling it.
The basic structure of a CFC is:
CFCOMPONENT
CFFUNCTION
CFARGUMENT (could be more than one)
... code for processing ... (in this case, your database query)
CFRETURN (data - your query object, or JSON object, whichever is required)
/CFFUNCTION (closing tag)
/CFCOMPONENT (closing tag)
J'ai pensĆ© que vous ne connaissiez peut-ĆŖtre pas les CFC, immĆ©diatement aprĆØs avoir soumis ma rĆ©ponse.
Je ne sais pas combien d'expĆ©rience ColdFusion vous avez, mais les fichiers CFC sont assez faciles Ć apprendre. Bien qu'il soit typique de placer des fichiers CFC dans un dossier / components, vous pouvez placer le CFC dans le mĆŖme dossier que le fichier CFM qui l'appelle.
La structure de base d'un CFC est la suivante:
CFCOMPONENT
CFFUNCTION
CFARGUMENT (pourrait ĆŖtre plus d'un)
... code pour le traitement ... (dans ce cas, votre requĆŖte de base de donnĆ©es)
CFRETURN (donnĆ©es - votre objet de requĆŖte ou objet JSON, selon le cas)
/CFFUNCTION (balise de fermeture)
/CFCOMPONENT (balise de fermeture)
HTH,
^_^