SQL: GROUP_CONCAT(), hacka sig in i konkatenerad "lista"

Permalänk

SQL: GROUP_CONCAT(), hacka sig in i konkatenerad "lista"

Hejsan, roar mig med att så sakteliga bygga en databas som kan hålla reda på mina Magic-kort. Passar på att krångla till det lite så att jag lär mig något nytt och nu har jag lyckats utöver förväntan... Att krångla till det alltså. (Har använt mig flitigt av spoiler-taggar för att göra det hela lite mer överskådligt, blev en hel del kod.)

Superkort om Magic så att den problematiska queryns syfte framgår lite tydligare:

Kortspel! Varje expansion omfattar ett antal kort och varje block består av (vanligtvis) tre expansioner. "Startdatum" för blocket är det samma som datumet för dess tidigaste expansion.

Dold text

Har två tabeller i en MySQL-databas (InnoDB): block och expansion (se nedan):

id block 1 Ice Age 2 Mirage

id blockid expansion date 7 1 Ice Age 1995-06-00 8 1 Alliances 1996-06-10 9 1 Coldsnap 2006-07-21 10 2 Mirage 1996-10-07 11 2 Visions 1997-02-03 12 2 Weatherlight 1997-06-09

Dold text

Nedan är den nuvarande queryn samt dess resultat:

SELECT MIN(expansion.date) AS "minDate", MAX(expansion.date) AS "maxDate", GROUP_CONCAT(expansion ORDER BY expansion.date SEPARATOR ", ") AS "expansion", block.block AS "block" FROM expansion INNER JOIN block ON blockid = block.id GROUP BY block ORDER BY minDate

minDate maxDate expansion block 1995-06-00 2006-07-21 Ice Age, Alliances, Coldsnap Ice Age 1996-10-07 1997-06-09 Mirage, Visions, Weatherlight Mirage

Dold text

Jag vill kunna "hacka" expansionerna och sätta in datum efter varje expansion.
Min första tanke var att på något sätt sätta in värdet för expansion.date som GROUP_CONCAT( ... SEPARATOR expansion.date). Det ville sig inte. Därefter försökte jag hämta datum för expansionerna och lägga i en variabel/array som separator. Lyckades inte med det heller och även om det skulle gå får bara två av tre expansioner ett datum. Skulle förvisso kunna lösa det genom att lägga in maxDate sist efter expansionerna. Känns dock långt ifrån optimalt.

Istället för:

expansion Ice Age (1995-06-00[expDate]), Alliances (1996-06-10[expDate]), Coldsnap (2006-07-21[maxDate])

Vill jag visa:

expansion Ice Age (1995-06-00[expDate]), Alliances (1996-06-10[expDate]), Coldsnap(2006-07-21 [expDate])

([expDate] indikerar vilket index det rör sig om.)

Finns här någon med en idé om hur jag kan lösa detta?

Permalänk

Löst!

Skrivet av Lakritsugglan:

Nedan är den nuvarande queryn samt dess resultat:

GROUP_CONCAT(expansion ORDER BY expansion.date SEPARATOR ", ") AS "expansion",

Jag vill kunna "hacka" expansionerna och sätta in datum efter varje expansion.

Löste det genom att sätta in datumet, inte som SEPARATOR men efter expansionen separerat med kommatecken i GROUP_CONCAT enligt:

GROUP_CONCAT(expansion.expansion," (",expansion.date,")" ORDER BY expansion.date ASC SEPARATOR ", ") AS "expansion"

Utskriften i html-templaten blir nu:

Ice Age (1995-06-00), Alliances (1996-06-10), Coldsnap (2006-07-21) Mirage (1996-10-07), Visions (1997-02-03), Weatherlight (1997-06-09)

Nästa steg är att strippa bort "-00".

Hittade mängder av nyttig info på http://sqlzoo.net/