Citat:
Ursprungligen postat av
Talidass
Har kört fast på en skoluppgift och vi har ingen handledning närmsta veckorna eller möjlighet att mejla läraren.
Har en tabell med tävlingar, med primary key starttid.
Behöver få ut ett namn på den person som senast tävlade. Enda tipset vi fått är använd curdate.
har försökt med följande:
select Ryttare.namn, curdate(starttid)
from Ryttare, Tävling
where Ryttare.pnr=Tävling.pnr
group by Tävling.starttid;
Nu är jag grymt sen på bollen och Smurfanerlite har gett dig ett giltigt svar. Däremot så vill jag tipsa om att använda lite mer modern SQL-syntax, som faktiskt är tydligare i vad du vill göra och varför:
SELECT TOP 1 r.namn, t.starttid
FROM Ryttare r
INNER JOIN Tavling t ON r.pnr = t.pnr
ORDER BY t.starttid DESC;
Dels använder jag mig av tabell-alias. Istället för att på varje ställe det används, skriva ut tabellnamnet, så skriver man bara aliaset. Mycket smidigare och i de fall man behöver använda tabellen mer än en gång i samma fråga, är det nödvändigt att använda sig av alias.
Om man "joinar ihop" två eller fler tabeller, ska aliaset användas överallt där kolumnnamn spec:as. Då slipper man en massa funderingar i efterhand om var datat kommer ifrån. Använder man sig av endast en tabell är alias onödigt.
Själva joinen då? Det finns en massa olika sätt att koppla ihop tabeller och därför är det bättre att lära sig rätt syntax från början.
Sedan funderade jag ett varv till och varför skulle du använda dig av curdate, som ger dig dagens datum? Enda tanken som poppar upp, är att tabellen Tavling innehåller kommande tävlingar och för att se vem som tävlade sist, till skillnad från vem som kommer tävla sist, måste frågan se lite annorlunda ut:
SELECT TOP 1 r.namn, t.starttid
FROM Ryttare r
INNER JOIN Tavling t ON r.pnr = t.pnr
WHERE t.starttid < CURDATE()
ORDER BY t.starttid DESC;
Om det är så att starttid är datum och tid, så bör man använda sig av CURRENT_TIMESTAMP() istället för CURDATE() som bara jämför datum. Blir lite olika resultat om man använder fel nämligen.