За да получите този резултат, ще искате да завъртите информацията. MySQL няма централна функция, но можете да използвате агрегатна функция с CASE
израз.
Ако броят на датите е известен, тогава можете да кодирате заявката:
изберете client_id, max(случай, когато rownum =1, след това край на датата) Date1, max(случай, когато rownum =2, след това край на датата) Date2, max(случай, когато rownum =3, след това край на датата) Date3from( изберете client_id , дата, @row:=if(@prev=client_id, @row,0) + 1 като rownum, @prev:=client_id от вашата таблица, (SELECT @row:=0, @prev:=null) r подреждане по client_id , дата) група по client_idorder по client_id, date
Вижте SQL Fiddle с демонстрация
Внедрих потребителски променливи, за да присвоя номер на ред на всеки запис в client_id
група.
Ако имате неизвестен брой дати, тогава ще трябва да използвате подготвено изявление, за да създадете sql динамично:
SET @sql =NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'МАКС.(CASE WHEN rownum =', rownum, ' THEN date END) AS Date_', rownum ) ) INTO @sqlfrom( изберете client_id, date, @row:=if(@prev=client_id, @row,0) + 1 като rownum, @prev:=client_id от вашата таблица, (SELECT @row:=0) r поръчка по client_id, дата) подреждане по client_id, дата; SET @sql =CONCAT('ИЗБЕРЕТЕ client_id, ', @sql, ' от ( изберете client_id, дата, @row:=if(@prev=client_id, @row,0) + 1 като rownum, @prev:=client_id от yourtable, (SELECT @row:=0) r поръчка по client_id, date ) s група по client_id поръчка по client_id, date');ПРИГОТОВЯТЕ stmt ОТ @sql;ИЗПЪЛНЯВАНЕ stmt;ПРЕКРАТЕ ПОДГОТОВКА stmt;
Вижте SQL Fiddle с демонстрация .
И двете дават резултат:
<предварителен код>| CLIENT_ID | ДАТА_1 | ДАТА_2 | ДАТА_3 |------------------------------------------------ -------------------------------------------------- ------------| 1 | 03 февруари 2013 г. 00:00:00+0000 | 10 февруари 2013 г. 00:00:00+0000 | 12 май 2013 г. 00:00:00+0000 || 2 | 03 февруари 2013 г. 00:00:00+0000 | 15 юли 2013 г. 00:00:00+0000 | (нула) |