tjo tStart ska representera olika delstarter i en tävling (en serie?)? för att förtydliga Så vad du har är egentligen ett antal "riktiga starter" A, B, C, och för vissa av starterna, så finns det fler starter, A består egentligen av A1 och A2, B av B1, B2, B3, medan C har en enda start? tabellen "starter" Om jag nu då äntligen har hajat är då mitt förslag att istället lägga upp det enligt: Jag kastade in spelarID på varje serie nu, det underlättar ju även senare om jag vill ha statistik för en spelare (bara hämta max och avg från serietabellen) Har du bytt till min variant? Det där funkade ju bra, men hur gör jag då för att jag i tex start B även skall få ut resultatet från start A och i start C få ut resultatet från A+B ? Eh? jag kanske var lite luddig så vi tar det från början Då är min spontana tanke att du ska dela upp det i kval och final. Jag är lite skeptisk till jag har tänk som så att ett heat är ett heat oavsett om det är ett kval eller en final eftersom de har samma struktur (X serier och en spelare), starterna är dessutom markerade med ett bit-fält om de är kval eller inte Och då börjar vi komma tillbaks till din ursrpungliga ide. Det där var nog en spark i rätt riktning, jag får sätta mig och labba lite med det när jag fixat till min "ful-lösning" som visar rätt resultat, men kräver att man sparar om mellan varvenrekursiv sql-fråga eller liknande
nu sitter jag och försöker göra nånting som säkerligen är enklare än jag fattar ;)
Jag har 3 tabeller
tStart
tSpelare_I_Start
tSpelare_I_Start_Serier
tStart har en koppling till sig själv i med fälten startID och AddScoreFrom för att man skall kunna skicka med poäng mellan starter
nu kommer då problemet
om jag har 3 starter som hänger ihop så skall då poängen adderas efterhand
saken är ju den att jag inte vet hur många nivåer det kommer vara och antalet serier varierar även i starterna.
det jag vill lyckas med är att skriva en lagom mängd SQL som tar 1 inparameter, dvs start ID och sen listar:
Spelar ID
serier för starten
summan av samtliga underliggande starter
antalet serier i dessa starter
Anledningen till att jag vill göra på detta sättet är att jag riskerar att drabbas av fel om jag sparar totalvärden på fler ställen än jag redan gör (dvs i tabellen tSpelare_I_Start, där totalen för DEN starten ligger), om nu någon ändrar ett resultat i efterhand så måste man ju då sitta och spara om samtliga efterkommande starter för att det skall bli rätt i slutetSv: rekursiv sql-fråga eller liknande
Och den har en koppling till sig själv, vad betyder denna koppling?
Min gissning är att du bör ändra så att du istället har en tabell för alla tävlingar, och lägger ett tävlingsid på varje start.Sv:rekursiv sql-fråga eller liknande
jag har en tabell som har alla tävlingar
sen i tabellen tStarts har en relation till tTavling
En tävling har X antal starter varav vissa skall få med resultat från tidigare starter i samma tävling
tStarts har sedan en koppling till spelare via en "kopplingstabell" och det är till den jag sedan kopplar serierna.
saken är dock den att man skall kunna visa resultatet start för startSv: rekursiv sql-fråga eller liknande
Och det du vill ha är då A, B, C, och inte A1, A2, B1, B2, B3, C?Sv:rekursiv sql-fråga eller liknande
StartID
TavlingsID
AntalSerier
AddScoreFrom (koppling till starter.StartID)
Tabellen "spelare i start"
EntryID
StartID
PlayerID
Tabellen "Serier"
SerieID
EntryID
Resultat
Följdaktligen så skall ett startresultat "byggas" av N antal serier ur "Serier"
Så spelarstart A har då en spelare, tillhör en delstart, och har ex vis 6 rader i tabellen Serier
och det jag behöver hämta ut under resans gång är då totala resultatet och antalet spelade serier t.o.m aktuell start
Krångligt ? japp
alternativet är ju att man sparar totaler men då vet jag att man kommer få felaktiga värden eftersom folk då måste spara om start A,B och C om de gjort en resultatändring i en serie tillhörande ASv: rekursiv sql-fråga eller liknande
Starter
====
StartID
TävlingsID
Delstarter
=====
StartID
DelstartsID
AntalSerier
Sen hur man hanterar de två andra är knepigare (fan vet om det inte är det här man håller på med för 4NF, det är ett ovanligt problem.)
En variant är att skippa "SpelareIStart":
Serier
====
SerieID
SpelarID
DelstartsID
Då blir det implicit, är spelaren med i en serie så är den med i starten. En annan variant är att ändå ha med Spelare i start:
SpelareIStart
====
EntryID
StartID
SpelarID
Serier
====
SerieID
SpelarID
DelstartsID
Men då blir det krångligare att se till att Serier vs SpelareIStart inte får anomalier.
Hur som helst tror jag att det här blir enklare och renare i längden.
Då är ju din grundfråga ganska enkel.Sv:rekursiv sql-fråga eller liknande
då återstår ju bara frågan hur Queryn bör se ut ;)
jag är helt nollställd just nuSv: rekursiv sql-fråga eller liknande
Starter
====
StartID
TävlingsID
Delstarter
=====
StartID
DelstartsID
AntalSerier
Serier
====
SerieID
SpelarID
DelstartsID
Resultat
Observera att starter som bara finns med en gång måste stå först i Starter och sen i Delstarter
Du vill ha ut resultat per start?
1. Hämta ut resultaten för varje kombination spelare, delstart (antar jag?);
SELECT SpelarID, DelstartsID, SUM(Resultat) FROM Serier GROUP BY SpelarID, DelstartsID
2. Släng ihop alla delstarter till en start, något i stil med
SELECT StartID, SpelarID, SUM(Res) FROM (SELECT SpelarID, DelstartsID, SUM(Resultat) AS Res FROM Serier GROUP BY(SpelarID, DelstartsID)) X INNER JOIN DelStarter ON X.DelstartID = Delstarter.DelstartID) GROUP BY StartID, SpelarID
Och sen kan du ytterligare slänga på TävlingsID ett steg upp.Sv:rekursiv sql-fråga eller liknande
Sv: rekursiv sql-fråga eller liknande
"start B även skall få ut resultatet från start A "
du vill ha ut B + A här?
" i start C få ut resultatet från A+B"
Du vill ha ut A + B här? Eller A+B+C?
Hur som helst var det inte riktigt så det var beskrivet; en delstart kan bara vara del av _en_ start.
Det du beskriver låter som en ganska märklig situation, kan du förklara lite närmare vad det är för något och varför man vill göra så?Sv:rekursiv sql-fråga eller liknande
Vi har en bowlingtävling. Denna tävling har X antal "kvalheat". I dessa så spelar varje spelare 6 serier.
(varje spelare spelar minst 2 kvalheat och detta ligger till grund för finalheaten)
kvalheaten skall bara det heatets total visas, men när man sedan kommer till finalheaten så händer det ibland att man tar med sig föregående heats poäng, en slags utslagstävling med andra ord.
Så ett typfall skulle vara nåt i stil med detta för en spelare.
Resultat Finalheat1 = 1000
Resultat Finalheat2= 1500+ Resultat Finalheat1
Resultat Finalheat3= 1300+ Resultat Finalheat1+Resultat Finalheat2
jag har försökt göra livet enklare genom att spara undan totalen för ett heat och sedan hämta upp det till nästa heat och addera det nya resultatet, men den lösningen känns lite instabil med tanke på att man då måste komma ihåg att spara om starter om man gör ändringar, något jag inte är helt övertygad om att användarna kommer göraSv: rekursiv sql-fråga eller liknande
>så händer det <b>ibland</b> att man tar med sig föregående heats poäng
Hur styrs detta, är det på tävlingsbasis?
Är det alltid samma regler?
Kan det hända att kvalheaten ska blandas in i finalpoängen?Sv:rekursiv sql-fråga eller liknande
detta styrs på tävlingsbasis, dvs vilket heat som helst skall kunna hämta resultat från ett tidigare heat
hade jag fått bestämma hade alla tävlingarna haft samma spelsystem, men nu får jag ju inte det ;)Sv: rekursiv sql-fråga eller liknande
Det är en kreativ uppgift att hitta rätt datamodell, och det är svårt när man inte har all info. Om det bara finns två olika sätt, "använd inte föregående" och "använd föregående" så kan du dela upp det i två grupper, och särbehandla dem. Om det finns mer än de här två sätten, så kan din ursprungliga ide funka, men du får då hemsk kod och måste vara jävligt försiktig så att du inte får loopar...
En sista variant som kan funka och som jag gillar är att byta till en N-till-N-koppling.
1. En serie är alltid del av ett delheat.
1. Ett delheat kan vara del av många olika heat. Delheat A är del av heat A, "heat A+B", och heat "A+B+C" I många fall är delheat samma sak som heat, och det är alltid på hela heat man räknar.
2. Varje heat kan byggas upp av många delheat.Sv:rekursiv sql-fråga eller liknande
måste få fram nåt att visa upp typ idag :(
(och klienten skiter i HUR det funkar, bara det funkar ;) )