SQL Déterminer choix dans une liste triée

Fermé
ylsnovak Messages postés 4 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 15 novembre 2011 - 15 nov. 2011 à 13:23
ylsnovak Messages postés 4 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 15 novembre 2011 - 15 nov. 2011 à 17:16
Bonjour,

Difficile de faire un titre explicite avec si peu de caractères. :-/

J'ai deux tables :

Les collaborateurs avec leurs IDs.
Les voyages avec les dates des déplacements. une colonne avec l'ID du collab, une avec les dates de déplacements et l'une avec les lieux de destination.

Comment faire un lien entre ses tables pour rechercher la localisation a une date données. Bien sur la date ne correspond pas forcement a un voyage. On cherche première date précédent la date de recherche.

La première partie doit concerner la table des collaborateur. S'il ne se sont jamais déplacer le résultat ne peux pas être vide mais avoir une ligne avec le nom du collaborateur et NULL.


Si vous avez une idée ou qu'il y a une réponse a une question similaire. J'avoue ne pas avoir su trouver les bons mots clefs en utilisant la recherche du forum.

Merci a tous ^^

6 réponses

dna.factory Messages postés 25454 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 2 janvier 2025 1 613
15 nov. 2011 à 14:21
alors pour etre sur que j'ai bien compris.
tu vas donner une date en variable, et tu veux que ton programme te dise :

pierre était à paris
paul etait à new york
yannick était à trouperdu-les-vaches-sur-ruisseau
marc était nul (désolé, humour pourri)

sachant que ta table voyages est du genre
id -- lieu -- départ -- arrivée
10 -- new-york -- 01/10/11 -- 10/10/11
10 -- paris -- 11/10/11 -- 22/10/11
10 -- tokyo -- 30/10/11 -- 01/11/11

pour moi, il est dispensable que l'on ait une date de début de voyage ou de fin de voyage
ou alors il faut avoir quelque chose comme ça

id -- ville -- journée
10 -- new-york -- 01/10/11
10 -- new-york -- 02/10/11
10 -- new-york -- 03/10/11
10 -- new-york -- 04/10/11

mais comme ça, ta base va etre énorme, vu que tu auras 300 lignes par personne par an.

une troisieme possibilité consiste a avoir du champs texte dans ta base indiquant 'du 01/10/11 au 10/10/11', mais ça veut dire du traitement de texte en folie dans les requetes, donc je préfere imaginer que personne n'a envisagé de faire comme ça.

si tu as choisi l'option 1, c'est relativement facile

tu fais un
tu fait rentrer ta valeur en variable
select personne.nom, voyage.ville from personne, voyage where personne.id=voyage.id and voyage.depart < variable and voyage.arrivee > variable

ce n'est pas tout a fait ce que tu as demandé, car il n'y a pas le null
je sais qu'il suffit de rajouter une option pour forcer l'affichage (je crois que c'est lié au group by), je réfléchis et j'essaye de retrouver ça.
1
dna.factory Messages postés 25454 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 2 janvier 2025 1 613
Modifié par dna.factory le 15/11/2011 à 15:52
Ouch,
déja au vu de ta base, tes informations seront faussées, désolé de te l'apprendre.

a moins qu'il y ait des lignes
10 -- bureau-- 10/10/11
10 -- vacances -- 15/10/11
10 -- maladie -- 22/10/11

le null ne servira à rien... ou plus exactement, le null n'apparaitra que pour ceux qui n'ont jamais voyagé.

j'ai bien compris que ce n'est pas ta faute, et après tout c'est peut-etre un exercice, donc on s'en fout des détails.

la réponse doit etre obtenue uniquement en sql (exercie), ou c'est le résultat qui compte (travail) ?
Stop failing the turing test !
1
dna.factory Messages postés 25454 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 2 janvier 2025 1 613
15 nov. 2011 à 16:48
bon, si c'est de la prod, alors, tout les coups sont permis...
cool...
la solution ici, est de ne pas se 'borner' à la base de donnée, et de ne pas essayer de faire le truc en une requete, mais plutot en plein de requete dans une boucle.

par exemple un truc du genre :
tu saisie la date dans choix_date

POUR compte DANS 'select id from personne;' FAIRE
select personne.nom, voyage.ville where personne.id=voyage.id and personne.id= $compte and date > $choix_date limit 1;
FIN POUR

tu rajoute une conditionelle quelque part pour afficher un 'null'
et tu vas prendre une douche (ou plusieurs) en essayant de te rassurer en te disant que tout le monde aurait fait pareil, c'est pas sale...
1
ylsnovak Messages postés 4 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 15 novembre 2011
15 nov. 2011 à 15:13
Merci Dna.Factory pour ton explication rapide et claire.

J'aurais du prendre le temps de donner un exemple de la base, ca aurait été beaucoup plus simple.

Voila un exemple de la table :

id -- lieu -- départ_le
10 -- new-york -- 10/10/11
10 -- paris -- 22/10/11
10 -- tokyo -- 01/11/11


Si je cherche 25/10/11 je veux obtenir tokyo car il a quitté paris le 22/10/11 il se trouve maintenant à Tokyo.

Comme tu le souligne, heureusement je n'ai pas une ligne par jour ^^. Mais malheureusement, je n'ai pas la main sur la structure de la base de données et je ne peux pas donc rajouter d'autre dates dans cette table.

On peut oublier le null pour l'occasion.
0
dna.factory Messages postés 25454 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 2 janvier 2025 1 613
15 nov. 2011 à 15:17
après travail de mémoire, c'est avec les inner join pour obtenir les nulls, mais comme tu l'as dis, on pourra voir plus tard.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ylsnovak Messages postés 4 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 15 novembre 2011
15 nov. 2011 à 16:14
Ce n'est pas un exercice j'ai bien cette base en face des yeux, elle est bien pleine :D. Pour 'simplifier' je ne met pas toutes les colonnes ( une 50aine ) car on n'ont rien a voir avec mon problème.

Si on reprend ton dernier exemple :

10 -- bureau-- 10/10/11
10 -- vacances -- 15/10/11
10 -- maladie -- 22/10/11

le 20/10/11 il était en maladie.

Oui tu as bien analysé la situation : c'est mal br_nlé mais j'y peux rien ^^. Ca a du sembler logique a un autre gars à une autre époque.

Une autre question pourrait être combien te temps était il en maladie ? la réponse serait du 16/10/11 au 22/10/11.
0
ylsnovak Messages postés 4 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 15 novembre 2011
15 nov. 2011 à 17:16
Bon je crois que je vais prendre la solution de la douche ... la performance n'est vraiment pas critique dans ce cas. (1ms ? 100ms ? pareil). Merci beaucoup pour ton aide

Si je trouve une soluce je la présentais :)
0