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.
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
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
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?