Tri d'après les valeurs contenues dans un champ

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tri d'après les valeurs contenues dans un champ

par jpfil » 16 mars 2005, 20:08

Je sais bien que la structure de ma BD pourrait être optimisée afin de me permettre de faire le tri uniquement en MySql. Cependant, pour toutes sortes de raisons je dois conserver les tables telles quelles. Je n'ai donc pas le choix de faire mon tri à partir du seul champ 'circuit', où je place une ou plusieurs valeurs, selon que le même vol est inclus dans un ou plusieurs circuit, d'où ma demande originale de pouvoir faire le tri sur différentes valeurs contenues un peu partout dans un même champ.

Merci quand même pour ta réponse.

par sadeq » 16 mars 2005, 14:28

Je ne suis pas d'accord du tout sur ta conception de base de la notion de circuits d'un vol. Et c'est ça qui empêche la requête SQL d'effectuer le bon tri.

En effet, je croyais que tu stock une seule valeur "CRSLxx" ou "CRIMxx" dans le champ "circuit" alors que toi tu stock une série de circuits dans un le champ "circuit" d'un vol donnée.

En fait, un vol a 1 ou plusieurs circuits. La table "vol" doit se mettre alors en association avec une autre table "circuit". L'association produit donc plusieurs lignes de type vol > circuit.

Vol
----
num_vol

Circuit_Vol
------------
num_vol
code_circuit
num_série_circuit

Circuit
--------
code_circuit
nom_circuit

Les codes circuits sont : CRSL, CRIM, ...
Et les lignes Circuit_Vol peuvent être :

Pour représenter le circuit "CRSL01" :
num_vol = 1
code_circuit = CRSL
num_série_circuit = 01

Pour représenter le circuit "CRSL02" :
num_vol = 1
code_circuit = CRSL
num_série_circuit = 02

Pour représenter le circuit "CRIM01" :
num_vol = 1
code_circuit = CRIM
num_série_circuit = 01

etc.

La requête deviendrait :
SELECT * FROM Vol WHERE code_circuit LIKE 'CRSL' ORDER BY num_série_circuit;

Si je me plante, se serait plus simple d'envoyer les valeurs actuelle de ta table vol.

par jpfil » 15 mars 2005, 17:10

Merci de vos réponses.

La requête "SELECT * FROM vols WHERE circuit LIKE '%CRSL%' ORDER BY circuit;" est exactement celle que j'avais codée en premier, mais les résultats ne s'affichaient pas en ordre CRSL01, CRSL02, CRSL03 etc. Je persiste à croire que c'est parce que le champ 'circuit 'de certains vols CRSL débute par CRIM04, CRIM02 etc. (puisqu'ils sont également compris dans d'autres circuits) et que cela interfère sur l'ordre de classement puisque CRIM04 arrive devant CRSL01. Tout fonctionnerait sans problème si le champs ne contenaient que les valeurs de type CRSLxx mais voilà, il contient aussi des valeurs de type différents (CRIMxx, CRLGxx etc.).

Cela tend à appuyer le fait que la requête retire le contenu de TOUT le champ, et non seulement la valeur visée par LIKE, ce qui signifie dans notre cas que, avec l'opérateur LIKE '%CRSL%%', le champ contenant 'CRIM04 CRSL01' retournera 'CRIM04 CRSL04' et non pas seulement 'CRSL01'.

J'ai trouvé un moyen "détourné" pour en arriver à mes fins, en utilisant une boucle PHP (FOR) qui retire, avec des requêtes MySql successives, les enregistrements contenant la valeur CRSL01, puis CRSL02, puis CRSL03 etc., en plaçant le résultat dans un tableau. Celui-ci est affiché dans la page en utilisant une même boucle FOR. Cela fonctionne très bien mais on achemine alors une foule de "petites" requêtes au serveur plutôt qu'une "normale".

Re: Tri d'après les valeurs contenues dans un champ

par sadeq » 14 mars 2005, 11:18

L'extraction des vols du circuit CRSL est assez aisée :

SELECT * FROM vols WHERE circuit LIKE '%CRSL%'

.... Le classement doit donc se faire sur les valeurs CRSL contenues dans le champ 'circuit'. ....

..... On ne peut également pas faire le tri sur le champ 'circuit' car, dans notre exemple, le Vol 002 faisant également partie du circuit 'CRCN', un tri sur ce champ serait faussé parce qu'il porterait sur la valeur CRCN et non sur CRSL, plus loin dans la chaîne.....
Selon ton premier raisonnement, la dernière déductioon est fausse.
En effet, puisque tu fait un critère "LIKE" sur "circuit", si tu rajoute un "ORDER BY circuit" le tri se fera bien sur tous les circuits contenant le mot désigné par "LIKE".
Exemple :
SELECT * FROM vols WHERE circuit LIKE '%CRSL%' ORDER BY circuit;

Affiche les vols classés selon les valeurs du champ "circuit" contennant le mot "CRSL".
Sortie possible :
CRSL01
CRSL02
....
Mais pas de "CRCNxx".

par hrz » 12 mars 2005, 10:35

je verait bien un order sur le champ circuit
le Vol 002 faisant également partie du circuit 'CRCN', un tri sur ce champ serait faussé parce qu'il porterait sur la valeur CRCN et non sur CRSL, plus loin dans la chaîne.
la par contre j'ai du mal a te suivre car tu a bien un LIKE '%CRSL%'

Tri d'après les valeurs contenues dans un champ

par jpfil » 11 mars 2005, 20:13

Étant donné une table de trajets aériens unitaires dont le champ 'circuit' permet d'identifier si le vol fait partie d'un circuit et en indique le rang. Par exemple le Vol 002 peut recevoir dans son champ 'circuit' les valeurs 'CRCN01' et 'CRSL03' s'il fait partie des circuits CRCN et CRSL. Je désire faire une requête qui va extraire et trier les vols propres à un circuit donné.

L'extraction des vols du circuit CRSL est assez aisée :

SELECT * FROM vols WHERE circuit LIKE '%CRSL%'

Un tableau se construit et reçoit les enregistrements extraits. Je veux cependant que le circuit soit affiché selon la chronologie des vols, soit CRSL01, CRSL02, CRSL03 etc. Le classement doit donc se faire sur les valeurs CRSL contenues dans le champ 'circuit'. Dans mon exemple, le Vol 002 devrait donc occuper la troisième ligne du tableau du circuit CRSL.

On ne peut faire le tri sur le numéro de vol car ces numéros sont créés en fonction d'autres critères. Un circuit comprend donc des vols aux numéros disparates. On ne peut également pas faire le tri sur le champ 'circuit' car, dans notre exemple, le Vol 002 faisant également partie du circuit 'CRCN', un tri sur ce champ serait faussé parce qu'il porterait sur la valeur CRCN et non sur CRSL, plus loin dans la chaîne.

Comment peut-on donc faire le classement sur une valeur contenue dans un champ ? Ici je veux évidemment que le classement se fasse selon les différentes valeurs CRSLxx, soit CRSL01, CRSL02, CRSL03, CRSL04 etc..

Merci.