Afin d'obtenir ce résultat, vous voudrez pivoter les données. MySQL n'a pas de fonction pivot mais vous pouvez utiliser une fonction d'agrégation avec un CASE
expression.
Si le nombre de dates est connu, vous pouvez coder en dur la requête :
select client_id,
max(case when rownum = 1 then date end) Date1,
max(case when rownum = 2 then date end) Date2,
max(case when rownum = 3 then date end) Date3
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0, @prev:=null) r
order by client_id, date
) s
group by client_id
order by client_id, date
Voir SQL Fiddle avec démo
J'ai implémenté des variables utilisateur pour attribuer un numéro de ligne à chaque enregistrement dans le client_id
groupe.
Si vous avez un nombre inconnu de dates, vous devrez utiliser une instruction préparée pour créer dynamiquement le sql :
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN rownum = ',
rownum,
' THEN date END) AS Date_',
rownum
)
) INTO @sql
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0) r
order by client_id, date
) s
order by client_id, date;
SET @sql
= CONCAT('SELECT client_id, ', @sql, '
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0) r
order by client_id, date
) s
group by client_id
order by client_id, date');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Voir SQL Fiddle avec démo .
Ils donnent tous les deux le résultat :
| CLIENT_ID | DATE_1 | DATE_2 | DATE_3 |
--------------------------------------------------------------------------------------------------------------
| 1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
| 2 | February, 03 2013 00:00:00+0000 | July, 15 2013 00:00:00+0000 | (null) |