Как превратить таблицу стилей Key / Value в обычную таблицу в MySQL - PullRequest
4 голосов
/ 06 декабря 2011

Я пытаюсь преобразовать следующую таблицу во что-то, что немного проще для запроса. Исторические данные важны, поэтому они не могут быть выброшены, и существует неопределенное количество параметров для переменной (мне нужны только некоторые из них в конечном результате).

Это почти то, что мне нужно сделать, но он не учитывает исторические данные и предполагает, что переменные являются уникальными для User_ID, в моем случае user_ID может иметь 3 или 4 одинаковых переменных, и мне нужно самый новый. См.> Сводная таблица MySQL

| UUID   |UUID_User |Variable  |Value     |DateSet              |
|--------|----------|----------|----------|---------------------|
| X123Y  |123XX12   |FirstName |Jane      | 2011-07-09 14:13:12 |
| X126Y  |123XX12   |LastName  |Jones     | 2011-07-09 14:13:12 |
| X173Y  |123XX62   |FirstName |Joe       | 2011-07-09 14:11:12 |
| X143Y  |123XX62   |LastName  |Smith     | 2011-07-09 14:11:12 |
| X129Y  |123XX12   |LastName  |Smith     | 2011-11-09 14:13:12 | << Jane Gets Married

Преобразуйте вышеперечисленное в (убедившись, что используете самую новую запись фамилии для Джейн)

|UUID_User |FirstName |LastName  |
|----------|----------|----------|
|123XX12   |Jane      |Smith     |
|123XX62   |John      |Smith     |

1 Ответ

3 голосов
/ 06 декабря 2011

Получение самой последней записи для пользователя является распространенной проблемой, которая часто помечается greatest-n-per-group в переполнении стека.Я предлагаю создать VIEW для этого, хотя это не является строго обязательным.

CREATE VIEW LatestKeyValue AS
 SELECT k1.*
 FROM KeyValue AS k1
 LEFT OUTER JOIN KeyValue AS k2
  ON (k1.UUID_User, k1.Variable) = (k2.UUID_User, k2.Variable) 
  AND k1.DateSet < k2.DateSet
 WHERE k2.DateSet IS NULL

Затем вы можете повернуть его для каждой необходимой вам переменной несколькими способами, такими как:

SELECT UUID_User, 
  MAX(CASE Variable WHEN 'FirstName' THEN Value END) AS FirstName,
  MAX(CASE Variable WHEN 'LastName' THEN Value END) AS LastName
FROM LatestKeyValue
GROUP BY UUID_User
...