Uppdatering Joina tabeller - Lärares ålder

  • Författare
  • Meddelande
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Uppdatering Joina tabeller - Lärares ålder

Inlägg07 feb 2019, 14:21

Jag uppdaterade artikel i del 3, guiden skolen "Joina tabeller". Det var delen med "Kursansvariges ålder" som var lite otydlig så jag skrev om stycket för att göra det enklare hur man kan jobba igenom den joinen.
https://dbwebb.se/guide/kom-igang-med-s ... beller#age
...
..:
.... /mos

liiinder

html-kodare

  • Inlägg: 12
  • Blev medlem: 30 aug 2018, 16:43

Re: Uppdatering Joina tabeller - Lärares ålder

Inlägg08 feb 2019, 04:59

Fortfarande sjukt otydligt om det ska hårdkodas eller inte.

Skulle verkligen behövas någon annan hint iom att det mest logiska med min kunskap vore att dra en subquery och köra limit på den men det är ju tydligen inte supportat :cry:

https://gitter.im/dbwebb-se/databas?at= ... 4df70ffff9
https://gitter.im/dbwebb-se/databas?at= ... 382efa2c65

Två till som undrar samma sak

edit: Inser när man läser på Subquery delen att man kanske borde använda join istället så blir att fippla lite till med den uppgiften imorgon... Men kan ju säga att man är sjukt nollställd för första gången detta kmomet.
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Uppdatering Joina tabeller - Lärares ålder

Inlägg08 feb 2019, 09:16

En första tanken är kanske subquery, eftersom vi pratat om det. Och upplägget liknar till viss del en subquery.

Man tänker kanske att man kan ta de tre äldsta lärararna från tabellen larare och använda deras akronym för att plocka ut de kurser de är ansvariga på.

Men problemet blir ju att dessa tre lärare, inde nödvändigtvis undervisar. Så enda sättet att plocka ut de tre lärare som undervisar (trippeljoin alt v_planering) och är äldst (ålder via tabell larare alt v_larare) är att joina och sen where.

Tittar man riktigt noggrant i uppgiften så ser man att Albus är äldst, men han har ingen undervisning så han är inte aktuell. Det var bara de tre äldsta lärarna som undervisar, som man vill ha fram.

Det må vara okey att hårdkoda where-satsen (ange ålder > X som skall visas), eller lägga till en limit, för att hantera så att enbart de tre äldsta undervisande lärarna visas i rapporten. Den blir svår att lösa mer dynamiskt så den släpper vi.

Sen är det också bra att minnas att subquery kan skrivas om till joins, inte för att det specifikt berör uppgiften, men det kan vara bra att ha i tanken när man väljer strategi för sin lösning. För mer info:
Rewriting Subqueries as Joins
...
..:
.... /mos

MagnusLj

sql-guru

  • Inlägg: 107
  • Blev medlem: 31 aug 2018, 14:57

Re: Uppdatering Joina tabeller - Lärares ålder

Inlägg14 feb 2019, 12:19

Av någon anledning lade jag inte riktigt märke till länken till den här forumtråden på uppgiftssidan, vilket hade sparat mycket tid, utan jag höll på med att traggla med uppgiften i några timmar själv istället, fast till sist fungerade det faktiskt.

Jag gjorde en vy där jag grupperade och sorterade kolumner från v_planering efter födelsedatum med limit på 3 så att jag fick de tre äldsta lärarna som undervisar, utan Dumbledore, som inte är med i den vyn. Sedan gjorde jag en annan vy där jag joinade kolumner från v_planering med den första vyn, på akronym/akronym, så att jag fick fram de tre lärarnas alla kurser. Sedan gjorde jag en tredje vy där jag joinade den andra vyn med v_larare på kursansvarig/akronym så att åldern kom med. Det var mycket jobb med att välja vilka kolumner jag skulle ha med i respektive vy för att det inte skulle bli dubletter (vilket jag säkert hade kunnat lösa på något smidigare sätt) men sedan fanns rätt data och då var det bara att göra så att det presenterades på rätt sätt. Egentligen hade man inte behövt joina med v_larare utan man hade bara kunnat räkna ut åldern från födelsedatumet i v_planering om man hade velat det.

Hans

html-kodare

  • Inlägg: 19
  • Blev medlem: 08 sep 2018, 12:24

Re: Uppdatering Joina tabeller - Lärares ålder

Inlägg17 feb 2019, 12:07

Hade frågan bara varit de tre äldsta lärarna som fortfarande undervisar hade frågan gått fortare. Gjorde det bara som övning först. Visat målreultat har de tre äldsta med deras kurser, ingen idé använda en tidigare vy med ålder som inte är kombinerad med undervisning. Behövs de tre äldsta från v_plan OCH deras undervisning, det blev en subquery för första delen.

Jag har ett annat problem: sorteringsordningen blir inte den samma som målet d.v.s. kursordningen under resp. lärare - vet inte om det är viktigt för uppgiften - men jag ser inte att given ordning går få fram med visade uppgifter. Omvänd ordning för ålder OK, men sedan? Inte på lärare, så måste vara kurs eller kod men det stämmer inte med given ordning...

Fråga: Måste ordningen vara exakt den samma?
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11199
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Uppdatering Joina tabeller - Lärares ålder

Inlägg18 feb 2019, 09:13

Hans skrev:Jag har ett annat problem: sorteringsordningen blir inte den samma som målet d.v.s. kursordningen under resp. lärare - vet inte om det är viktigt för uppgiften - men jag ser inte att given ordning går få fram med visade uppgifter. Omvänd ordning för ålder OK, men sedan? Inte på lärare, så måste vara kurs eller kod men det stämmer inte med given ordning...

Fråga: Måste ordningen vara exakt den samma?


Det kan stämma att jag inte styrde upp sorteringen på kursnamnet, vilket ger en del slumpmässighet i vilken ordning de kommer. Då blir det svårt/omöjligt att återskapa den exakta ordningen, sant.

Jag borde gjort en ORDE BY på kursnamnet så hade det inte varit ett bekymmer...
...
..:
.... /mos
Användarvisningsbild

abbe

html-kodare

  • Inlägg: 12
  • Blev medlem: 01 sep 2019, 20:30

Re: Uppdatering Joina tabeller - Lärares ålder

Inlägg05 feb 2020, 20:15

Var själv fast på den ett tag. Kunde visst hårdkoda LIMIT 6 men hur kul är det?
Tog det som en liten utmaning. Detta känns som en väldigt overkill workaround men en fungerande. Är öppen för mer eleganta lösningar.

Kod: Markera allt
SELECT
    CONCAT(k.namn, " (", k.kod, ")") AS kursnamn,
    CONCAT(l.fornamn, " ", l.efternamn, " (", l.akronym, ")") AS larare,
    TIMESTAMPDIFF(
        YEAR,
        fodd,
        CURDATE()
    ) AS alder
FROM
    (
        SELECT
            larare.akronym,
            larare.fornamn,
            larare.efternamn,
            larare.fodd,
            TIMESTAMPDIFF(YEAR, fodd, CURDATE()) AS alder
        FROM larare
            JOIN kurstillfalle
                ON larare.akronym = kurstillfalle.kursansvarig
            GROUP BY
                larare.akronym,
                larare.fornamn,
                larare.efternamn,
                larare.fodd,
                alder
            ORDER BY alder DESC
            LIMIT 3
    ) AS l
    JOIN kurstillfalle AS kt
        ON l.akronym = kt.kursansvarig
    JOIN kurs as k
        ON k.kod = kt.kurskod
    ORDER BY alder DESC;
What if people flew before Newton discovered gravity.

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 6 gäster