Qu'en est-ce?
SELECT T1.f1 as "date 1", T2.f1 as "date 2", T3.f1 as "date 3"
FROM (SELECT *
FROM `date_test`
ORDER BY `f1` DESC
LIMIT 1) AS T1,
(SELECT *
FROM `date_test`
ORDER BY `f1` DESC
LIMIT 1, 1) AS T2,
(SELECT *
FROM `date_test`
ORDER BY `f1` DESC
LIMIT 2, 1) AS T3
;
qui sort:
+------------+------------+------------+
| date 1 | date 2 | date 3 |
+------------+------------+------------+
| 2003-01-01 | 2002-01-01 | 2001-01-01 |
+------------+------------+------------+
Le seul inconvénient est que vous avez besoin d'au moins trois rangées, sinon il ne retournera rien ...
En utilisant JOIN
, vous pouvez le faire :
SELECT T1.id,
T1.f1 as "date 1",
T2.f1 as "date 2",
T3.f1 as "date 3"
FROM `date_test` as T1
LEFT JOIN (SELECT * FROM `date_test` ORDER BY `f1` DESC) as T2 ON (T1.id=T2.id AND T1.f1 != T2.f1)
LEFT JOIN (SELECT * FROM `date_test` ORDER BY `f1` DESC) as T3 ON (T1.id=T3.id AND T2.f1 != T3.f1 AND T1.f1 != T3.f1)
GROUP BY T1.id
ORDER BY T1.id ASC, T1.f1 DESC
Qui va retourner quelque chose comme:
+----+------------+------------+------------+
| id | date 1 | date 2 | date 3 |
+----+------------+------------+------------+
| 1 | 2001-01-01 | 2003-01-01 | 2002-01-01 |
+----+------------+------------+------------+
L'inconvénient est que date1
, date 2
et date 3
ne sera pas nécessairement dans un ordre spécifique (selon la sortie au-dessus de l'échantillon). Mais cela peut être réalisé par programme. Le côté positif est que vous pouvez insérer une clause WHERE
avant le GROUP BY
et vous pouvez effectuer une recherche par T1.id
, par exemple.
Pourquoi doit-il être tous dans une ligne? Il serait beaucoup plus facile d'avoir une seule colonne. –
Je pense qu'il est beaucoup plus logique de les renvoyer en tant que lignes, et non 1 rangée avec plusieurs colonnes. – dotariel
Avez-vous besoin des trois dernières dates pour chaque identifiant? (J'ai remarqué que votre identifiant est toujours 1) –