Som vanligt när det gäller sista uppgiften så försökte jag klura ut nåt som kunde vara lite lurigare att lösa men ändå inte jättesvårt. Denna gången ville jag undvika GROUP_CONCAT då ni säkert alla har full koll på det. Jag funderade på en blandning av JOINS och tänkte mig en SUBQUERY för att krånga lite.
När man tittade på lösningen för sista uppgiften så satt jag själv med två konstruktioner som gav olika delar av lösningen. En SELECT som gav halva lösningen inkl en av raderna med NULL och en annan SELECT som gav den andra halvan av lösningen med den andra raden av NULL.
Men hur man än gör, LEFT/RIGHT OUTER JOIN så går de två inte att
kombinera på ett bra sätt när det vara fyra tabeller inblandade.
Ah, kombinera två resultset -> UNION/UNION ALL. Wips så hade man svaret.
Jag tänkte, om de (studenterna) bara klurar tillräckligt länge, och inser att de har två lösningar som behöver slås samman, så kanske de kommer ihåg UNION från guiden. Jag gissar att den kan upplevas som lite trixig, men troligen en "Ah, så kan man göra-känsla" när (om) man ser lösningen.
En annan variant vore, om man inser problemställningen och kan formulera att det är en FULL OUTER JOIN som krävs, ungefär som Abbe gjorde ovan. En googling hur man löser den i MySQL och så kommer förslag på UNION, tex via StackOverflow "
How to do a FULL OUTER JOIN in MySQL".
Här är min kod när jag gjorde lösningsförslaget inför tentan, oklart om jag lyckades optimera det (jag försökte inte...). Jag tog helt enkelt samma SQL-sats, den ena använde LEFT OUTER på den kritiska biten (speldag) och den andra använda RIGHT OUTER på samma plats.
- Kod: Markera allt
SELECT * FROM
(
SELECT
a.namn AS Artist,
CONCAT(a.ort, "/", lk.namn, "(", a.landskod, ")") AS Ort,
sd.namn AS Dag,
DATE_FORMAT(sd.datum, "%D %M") AS Spelning,
s.klockslag AS Tid
FROM artist AS a
INNER JOIN landskod as lk
ON a.landskod = lk.kod
LEFT OUTER JOIN spelning AS s
ON a.id = s.artist_id
LEFT OUTER JOIN speldag AS sd
ON sd.id = s.speldag_id
UNION
SELECT
a.namn AS Artist,
CONCAT(a.ort, "/", lk.namn, "(", a.landskod, ")") AS Ort,
sd.namn AS Dag,
DATE_FORMAT(sd.datum, "%D %M") AS Spelning,
s.klockslag AS Tid
FROM artist AS a
INNER JOIN landskod as lk
ON a.landskod = lk.kod
LEFT OUTER JOIN spelning AS s
ON a.id = s.artist_id
RIGHT OUTER JOIN speldag AS sd
ON sd.id = s.speldag_id
) AS t
ORDER BY
Spelning, Tid
;
Kikar man på min lösning så ser man att jag faktiskt fick in en subquery, paranteserna runt SELECT UNION SELECT, för att lyckas sortera i rätt ordning.