J'espère être suffisamment clair, je maîtrise mal le sql et dérivé...
J'ai une requête qui fait la liste de documents.
Dans la table des documents, il y a 2 colonnes distinctes pour la date : la première correspond à la date de mise à jour de l'original, la seconde à la date de traduction, pleine si le document est une traduction, vide sinon.
Exemple:
DocId | Date | Date de Trad | Titre
1 | 10/01/94 | | Biographie de Imax
2 | 10/01/94 | 01/01/07 | Biography of Imax
3 | 02/05/94 | | Biographie de jean
Imaginons que je veuille que ma liste affiche les documents dans toutes les langues, et que l'ordre soit celui de la date la plus récente, qu'il s'agisse de "Date" ou de "Date de Trad".
En gros il faut que ma requête dise : liste de la table document ; avec DocId, Date, Date de Trad et Titre ; ordre : (Date ou Date de Trad) la plus récente en premier.
Ce qui me donnerait :
2 | 10/01/94 | 01/01/07 | Biography of Imax
3 | 02/05/94 | | Biographie de jean
1 | 10/01/94 | | Biographie de Imax
C'est possible en sql de faire ça ?
Je ne pense pas qu'une requête dans ce genre puisse fonctionner directement. Tu peux faire des tris sur une colonne, puis éventuellement sur une deuxième (en cas d'égalité sur la première colonne) avec une requête dans le genre:
Pour pouvoir faire un tri sur soit la valeur de DateTrad, soit la valeur de Date, je pense que le meilleure solution est de commencer par créer une vue qui reprend l'ensemble des informations de ta table plus une colonne supplémentaire qui contiendra la date max. Ensuite il suffira d'afficher le contenu de la vue en utilisant la dernière colonne pour trier.
code : Tout sélectionner
Select DocId, Date, DateTrad, Titre
From maTable
Order by DateTrad DESC, Date DESC;
/* Les résultats sont triés selon la date de traduction puis selon la date de mise à jour de l'original. */code : Tout sélectionner
Create view maVue AS
Select DocId, Date, DateTrad, Titre, Greatest(Date,DateTrad) as dateMax
From maTable ;
Select DocId, Date, DateTrad, Titre
From maVue
Order by dateMax DESC;Avec Date/Datetrad en champ de type TIMESTAMP:
SELECT * FROM `test` ORDER BY IF(datetrad=0, date, datetrad)
le résultat:
Edit: Ajoute un DESC à la fin pour inverser l'ordre si tu veux les avoir dans l'autre ordre..
SELECT * FROM `test` ORDER BY IF(datetrad=0, date, datetrad)
le résultat:
code : Tout sélectionner
val1 2007-01-25 12:13:38 0000-00-00 00:00:00
val3 2007-01-25 12:14:24 2007-01-25 12:15:00
val2 2007-01-25 12:14:04 2007-01-25 12:15:04
val4 2007-01-25 12:16:08 0000-00-00 00:00:00Dernière modification par Seldaek le jeu. janv. 25, 2007 12:24 pm, modifié 1 fois.
On ne peut pas directement faire ça ?
code : Tout sélectionner
Select DocId, Date, DateTrad, Titre, Greatest(Date,DateTrad) as dateMax
From maTable
Order by dateMax DESC;"World goin' one way, people another" Poot
Non on peut pas, mais ma solution devrait convenir.
Sinon le "AS" il est inutile de nos jours, "machin alias" marche très bien sans AS entre, enfin c'est un détail pour fénéants.
Sinon le "AS" il est inutile de nos jours, "machin alias" marche très bien sans AS entre, enfin c'est un détail pour fénéants.
Et j'imagine que je suis obligé de convertir mes dates en timestamp ?
"World goin' one way, people another" Poot
DD/MM/YYYY
Mais laisse tomber ta solution marche avec quelques modifications :
- c'est pas une "vraie" base sql mais une base access, j'utilise donc IIF
- plutôt que "datetrad=0" j'utilise la fonction isnull
Merci beaucoup pour le coup de main.
Mais laisse tomber ta solution marche avec quelques modifications :
- c'est pas une "vraie" base sql mais une base access, j'utilise donc IIF
- plutôt que "datetrad=0" j'utilise la fonction isnull
Merci beaucoup pour le coup de main.
"World goin' one way, people another" Poot
Ca roule, en effet le but c'était juste de checker si c'était vide, le timestamp c'est pas obligé, mais pratique quand même pour les dates (gestion décalage horaire).
Les bases de données ça rend impuissant.
Mais en vrai je m'en fous complètement