Hoe een Key/Value-stijltabel in een normale tabel in MySQL te draaien

Ik probeer de volgende tabel om te zetten in iets dat een beetje makkelijker te bevragen is. De historische gegevens zijn belangrijk zodat deze niet weggegooid kunnen worden en er is een onbepaald aantal opties voor Variabele (ik heb er maar een paar nodig in het eindresultaat).

This is almost exactly what I need to do but it doesn't account for the historical data and assumes that the Variables are unique to the User_ID in my case a user_ID may have 3 or 4 of the same variable and I need the newest one. See > MySQL Pivot Table

| 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

Transformeer het bovenstaande in (zorg ervoor dat je de nieuwste achternaam gebruikt voor jane)

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

1 antwoord

De meest recente invoer per gebruiker ophalen is een veel voorkomend probleem dat vaak wordt getagd greatest-n-per-group op Stack Overflow. Ik stel voor hier een VIEW voor te maken, hoewel dit niet strikt noodzakelijk is.

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

Vervolgens kunt u dat voor elke variabele draaien die u op een aantal verschillende manieren nodig hebt, zoals:

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
3
toegevoegd
@HelgaIliashenko, ik gebruik MariaDB niet. Maar je hebt gelijk, ik heb een fout gemaakt in mijn SQL-syntaxis, ik denk dat ik het heb gecorrigeerd. Bedankt voor het downvote.
toegevoegd de auteur Bill Karwin, de bron
raadpleeg de handleiding die overeenkomt met uw MariaDB-serverversie voor de juiste syntaxis om te gebruiken in de buurt van 'DAN'
toegevoegd de auteur Helga Iliashenko, de bron
@BillKarwin MariaDB is slechts een volledig achterwaarts compatibele MySQL-vork, die wordt geleverd met de nieuwste Ubuntu-installaties en XAMPP. Bedankt voor je correctie, ik heb het downvote opgeheven.
toegevoegd de auteur Helga Iliashenko, de bron
BINGO, dat uitzicht was precies wat ik nodig had om te zien waar ik verkeerd liep. Dit deed precies wat ik nodig had, bedankt.
toegevoegd de auteur digitalgecko, de bron