2013-11-18 5 views
0

Я хочу, чтобы преобразовать мои столбцы в строки и для того, чтобы показать последнее значение,Преобразовать столбец строк и получить последнее значение

Вот пример того, что моя база данных выглядит следующим образом:

Таблица 1:

 
+----+-----------------+ 
| id | location  | 
+----+-----------------+ 
| 1 | 2012/East/A/Flw | 
| 2 | 2012/East/A/Lvl | 
| 3 | 2012/East/B/Flw | 
| 4 | 2012/East/B/Lvl | 
+----+-----------------+ 

Таблица 2:

 
+------------+-------+------------------+ 
| locationid | value |  tstamp  | 
+------------+-------+------------------+ 
|   1 | 10 | 2013-11-18 10:00 | 
|   2 | 21 | 2013-11-18 10:00 | 
|   3 |  5 | 2013-11-18 10:00 | 
|   4 | 30 | 2013-11-18 10:00 | 
|   1 |  5 | 2013-11-19 11:00 | 
|   2 | 20 | 2013-11-19 11:00 | 
|   3 | 15 | 2013-11-19 11:00 | 
|   4 | 28 | 2013-11-19 11:00 | 
+------------+-------+------------------+ 

Я надеялся, что я могу получить выход быть таким:

 
+----------+-----+-----+ 
| location | Flw | Lvl | 
+----------+-----+-----+ 
| East A | 5 | 20 | 
| East B | 15 | 28 | 
+----------+-----+-----+ 

Спасибо за помощь!

+1

Вы действительно хранить данные в месте, как слэш разделителями в списке ? – billinkc

+0

@billinkc Yeap .. –

+0

Хорошо, позвольте мне попытаться рассказать о вопросе Билла: *** почему *** вы храните свои данные в виде списка с разделителями косой черты? Особенно, когда вы знаете, что каждая из этих частей имеет независимый смысл? –

ответ

0

Вы можете использовать динамический SQL для достижения этой

SET @sql = NULL; 

SELECT GROUP_CONCAT(CONCAT(
     'MAX(CASE WHEN locationid IN(', ids, 
     ') THEN value END) `', col, '`')) 
    INTO @sql 
    FROM 
(
    SELECT SUBSTRING_INDEX(location, '/', -1) col, GROUP_CONCAT(id) ids 
    FROM table1 
    GROUP BY SUBSTRING_INDEX(location, '/', -1) 
) q; 

SET @sql = CONCAT(
    'SELECT CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(location, ''/'', 2), ''/'', -1), '' '', 
        SUBSTRING_INDEX(SUBSTRING_INDEX(location, ''/'', -2), ''/'', 1)) location, ', 
    @sql, 
    ' FROM table1 l LEFT JOIN 
    (
     SELECT t.locationid, t.value 
     FROM 
     (
     SELECT locationid, MAX(tstamp) tstamp 
      FROM table2 
     GROUP BY locationid 
    ) q JOIN table2 t 
      ON q.locationid = t.locationid 
     AND q.tstamp = t.tstamp 
    ) d 
     ON l.id = d.locationid 
    GROUP BY CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(location, ''/'', 2), ''/'', -1), '' '', 
        SUBSTRING_INDEX(SUBSTRING_INDEX(location, ''/'', -2), ''/'', 1))' 
); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Выход:

 
| LOCATION | FLW | LVL | 
|----------|-----|-----| 
| East A | 5 | 20 | 
| East B | 15 | 28 | 

Вот SQLFiddle демо

+0

Помогло ли вам? Вам нужна дополнительная помощь по вашему вопросу? – peterm

Смежные вопросы