liste chronologique de dates...

emb1
Invité n'ayant pas de compte PHPfrance

19 déc. 2007, 13:00

Bonjour,

voila mon souci ...
j'ai une table construite avec les champs suivants :
id, refrence, date1, date2, date3, date4
(exemple de valeur et format : 1, reference1, 2008-02-01, 2008-02-28, 2008-03-06, 2008-04-01)

J'ai besoin de lister mes références par date, mais comme ces dates sont dans des champs différents, je n'arrive pas à sélectionner et à trier comme il faut ! J'ai même besoin d'afficher plusieurs fois la même référence, puisqu'il peut y avoir plusieurs dates associées à cette référence.

J'ai essayé comme ça, on est dans

Code : Tout sélectionner

$requete="SELECT * FROM matable ORDER BY date1, date2, date3, date4 ASC
Dans l'idée il faudrait une requete comme ça, mais celle là ne marche pas ... elle retourne tous les enregistrements plusieurs fois...
J'avais essayé aussi des boucles etc, mais à chaque fois il me sort pas le bon ordre...

Je voudrais le résultat :

reference 2 - 2008-01-01
reference 1 - 2008-02-01
reference 2 - 2008-02-15

Merci si vous pouvez me remettre sur le droit chemin !
Emmanuel

ViPHP
ViPHP | 4039 Messages

19 déc. 2007, 13:11

peut-être avec un UNION à soi-même, un par date.. à essayer. (petit lien)
Modifié en dernier par Berzemus le 19 déc. 2007, 13:27, modifié 1 fois.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 déc. 2007, 13:24

Je dirais défaut de fabrication et retour au SAV :x

Tu ne devrais pas avoir 4 champs date ayant une même fonction dans une même table.
Vaut mieux avoir une table "dates_ref" contenant les id (de la table que tu décris sommairement) et une date.
Avec ton exemple cette table donnerait

Code : Tout sélectionner

id date 1 2008-02-01 1 2008-02-28 1 2008-03-06 1 2008-04-01 2 2008-01-01 2 2008-02-15
La le tri pourrait se faire sur les dates et te sortir les références en fonction.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

emb1
Invité n'ayant pas de compte PHPfrance

19 déc. 2007, 13:45

Merci à tous les 2 !!

je teste avec UNION (je suis en train de me battre avec la syntaxe...

Code : Tout sélectionner

$requete=(SELECT * FROM seminaires2008 WHERE date_108_d='2008-$mois-$jour') UNION (SELECT * FROM seminaires2008 WHERE date_118_d='2008-$mois-$jour' );
T_string error...

Et en même temps je réfléchis à la remarque de Vighneshvara .... s'agissant de mettre les dates dans une autre table... ça serait peut-être la meilleure chose à faire mais ça serait un peu long maintenant...

je vous tiens au courant...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2007, 14:53

T_string error...
C'est une erreur php, cela signifie qu'il y a un problème avec une de tes chaines de caractères, et là, comme ça, à vu de nez, je dirais que cela vient de ta requête qui n'est pas encapsulée de guillemets ;)
Et en même temps je réfléchis à la remarque de Vighneshvara .... s'agissant de mettre les dates dans une autre table... ça serait peut-être la meilleure chose à faire mais ça serait un peu long maintenant...
C'est la meilleure chose à faire :)

Et c'est sur, ce serait sans doute un peu plus long maintenant de modifier la base et de refaire quelques uns de tes scripts, mais ça serait tellement de temps de gagné quand on te demanderas une évolution, quand tu reviendras sur ce code dans un an, ou quand un autre atterrira dessus dans 6 mois.... que ça peut sérieusement valloir la peine de s'intérroger s'il ne vaut mieux pas perdre un peu plus de temps maintenant pour bien faire, qu'énormément à chaque fois qu'il faudra faire quelque chose là dessus ;)

Ps : pis tant que t'en sera à te plaindre auprès du SAV, engueule les aussi pour le nom des tables comportant des numéros d'années ou pour le nom des champs dates, hautement explicite quant à leur contenu ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

emb1
Invité n'ayant pas de compte PHPfrance

19 déc. 2007, 15:20

oui tu as raison ! ! !

mais partant sur de bonnes bases (en mettant les dates dans une table) je rencontre maintenant un problème de conception !

Mes "reference" sont en réalité des formations, et chacune de ces formations peut se dérouler plusieurs fois dans l'année. Donc j'avais écrit les champs suivants, dans le même enregistrement :
id; nom de la formation; date1; date2; ...
Jusqu'à maintenant les formations ne se déroulaient pas + de 10 fois par an. Donc j'ai un champ date1, date2 etc...
J'ai 150 formations.
Comment pourrais-je créer une table de dates cohérente avec ce que je viens de dire ?????? je ne vois pas...

il me faudrait presque un calendrier complet !!! avec des noms de champs comme :
date20080101
date20080102
date20080102
ça ferait un enregistrement par jour, soit une table de 365 enregistrements... je ne sais pas
Quelqu'un pourrait-iol m'aider un peu sur la conception ?

Merci beaucoup !
Emmanuel

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 déc. 2007, 15:37

Vaut mieux avoir une table "dates_ref" contenant les id (de la table que tu décris sommairement) et une date.
Avec ton exemple cette table donnerait

Code : Tout sélectionner

id date 1 2008-02-01 1 2008-02-28 1 2008-03-06 1 2008-04-01 2 2008-01-01 2 2008-02-15
dans cet exemple "id" correspond à l'id de la formation.
ici on voit que la formation ayant comme id 1 se déroule sur 4 dates 2008-02-01, 2008-02-28, 2008-03-06, 2008-04-01
il me faudrait presque un calendrier complet !!! avec des noms de champs comme :
date20080101
date20080102
date20080102
surtout pas et c'est exactement ce que la remarque (Ps) de Ryle disait.
Les champs ne doivent pas dépendre du temps (année) c'est le contenu qui règle ça.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

emb1
Invité n'ayant pas de compte PHPfrance

19 déc. 2007, 15:55

ok

...mais à quoi ressemblerait ma table de dates svp ?

si je la conçois comme ça, avec 2 champs :
id_ref ; dates (en mettant mes dates dans ce champs, par exemple séparées par des virgules)

eh bien mon pb reste entier :
quand je voudrait lister trier par date je ferai comment ??? de la même façon qu'avec ma structure d'aujourd'hui, avec date1 date 2 date3 etc...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2007, 16:30

ok
...mais à quoi ressemblerait ma table de dates svp ?
A celle que t'a donné Truc ci dessus :) (avec un autre nom que "date" pour la colonne des dates, puisque c'est un mot clé sql protégé ;))
si je la conçois comme ça, avec 2 champs :
id_ref ; dates (en mettant mes dates dans ce champs, par exemple séparées par des virgules)
C'est top ! :)
eh bien mon pb reste entier :
quand je voudrait lister trier par date je ferai comment ??? de la même façon qu'avec ma structure d'aujourd'hui, avec date1 date 2 date3 etc...
Que nenni :)
L'avantage de cette structure c'est que tu peux avoir de 0 à N dates de formations, et qu'il te suffit d'une jointure pour croiser les données de tes deux tables pour obtenir toutes les dates des formations

Code : Tout sélectionner

SELECT tableFormation.champ1, tableFormation.champ2, ..., tableDateFormation.date_formation FROM tableFormation LEFT OUTER JOIN tableDateFormation ON tableFormation.id_formation = tableDateFormation.id_formation WHERE ... ORDER BY tableDateFormation.date_formation
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

emb1
Invité n'ayant pas de compte PHPfrance

19 déc. 2007, 16:50

Merci beaucoup Ryle !

je teste tout ça... je crois et j'espère avoir compris...

et avec ça je vais bosser mes jointures ! restons souple sur les genoux !

à plus tard
Emmanuel

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 déc. 2007, 17:13

id_ref ; dates (en mettant mes dates dans ce champs, par exemple séparées par des virgules)
une seule date dans ce champ qui sera de type "date" sinon même problème en vu.
Il y aura donc UN enregistrement PAR date de formation

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

emb1
Invité n'ayant pas de compte PHPfrance

19 déc. 2007, 18:08

Truc,
une seule date dans ce champ qui sera de type "date" sinon même problème en vu.
c'est ce qui me semblait aussi... mais Ryle pense pourtant que c'est jouable avec toutes les dates dans un seul champ...

Il y aura donc UN enregistrement PAR date de formation
je crois que je vais essayer plutôt ça, ça me parle mieux...

Encore merci, j'avance grâce à vous !

Je ne manquerais pas vous tenir au courant !
notons au passage que c'est un cas de figure qui doit être assez courant, mais je n'ai pas trouvé d'info claire là-dessus...

A bientôt !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 déc. 2007, 18:58

notons au passage que c'est un cas de figure qui doit être assez courant, mais je n'ai pas trouvé d'info claire là-dessus...
Oui, ça s'appel la normalisation qui va de paire avec la conception d'une BD. :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 déc. 2007, 22:10

c'est ce qui me semblait aussi... mais Ryle pense pourtant que c'est jouable avec toutes les dates dans un seul champ...
Euh... "que nenni" c'était pour "non" ;)

Un seul champ date dans ta table, qui contienra chacune de tes dates, oui, mais certainement pas toutes les dates dans un même enregistrement :) Je suis tout à fait de l'avis de Truc quant à la structure et à la façon de procéder :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

emb1
Invité n'ayant pas de compte PHPfrance

20 déc. 2007, 16:06

Salut !

Génial ! ça marche !
c'était simple finalement...

J'aurais pu trouver ça seul, mais, comme souvent, le fait d'en parler un peu ça permet d'y voir plus clair...

j'ai créé une table avec 3 champs : id, reference, date, comme convenu.

1 formation1 2008-02-15
2 formation1 2008-02-25
3 formation1 2008-03-16
4 formation2 2008-02-02
5 formation2 2008-01-20

et après je n'ai plus qu'à trier par... date !

Merci beaucoup !!!

à plus !
Emmanuel