Jag har en tabell där jag sparar alla mål och utvisningar från hockeymatcher. Nu skulle jag vlija räkna hur många aktiva utvisningar det finns för varje lag när ett lag gör mål. Hej Andreas, Oops...missade detaljen med utvisningar som stryks vid mål för motståndarlaget, vilket komplicerar saken ytterligare. Får fundera lite mer på den detaljen...men en variant är ju att vid mål gå in och sätta en flagga på utvisningen att den är struken. Detta kan man ju även använda när två spelare får varsin utvisning som kvittas. Då kan man ju ändå lägga in dessa för statistikens skull men direkt sätta en flagga som säger att den kvittades/ströks. Dessutom måste man lägga in en tidsstämpel när den ströks. Mattias >> Tack. Bra svar ;) Du kan aldrig rädda dig från felaktiga data, SISU kan vara ett bra uttryck att lära sig... (Skit in, Skit ut... *s*) Eller du kan rädda dig från felaktiga data om du redan vet resultaten eller vad det skulle kunna bli - men när användarna ska skriva in det så blir det inte bättre än vad de gör det till - tyvärr... =) Jag har tabeller för matcher, spelare, lag och serier Joru.. nog en bra idé å göra om designen... Har tänkt att lagra start och sluttid Jag tycker att det skall du inte göra i databasen, åtminstånde inte logiken.Räkna aktiva utvisningar
Några exempel
Om lag 1 gör mål efter 10.00 och lag 2 fick en spelare utvisad i 2 minuter efter 09.00 blir det så finns det en aktiv utvsining.
Om lag 1 gör mål efter 03.45 och lag 2 fick en spelare utvisad i 2 minuter efter 02.00 och lag 2 fick en spelare utvisad i 2 minuter efter 02.50 så finns det en aktiv utvisning eftersom den första utvisningen försvinner när det blev mål efter 03.00.
En spelare kan bli utvisad 2,5,10 och 20 minuter. 10 och 20 minuters utvisningarna är personliga så dom ska inte räknas med.
En spelare kan även få 2+2 minuter
Tabellen ser ut så här
<code>
EventID GameID TeamID period time_min time_sec player_id ass_id1 ass_id2 penaltyID penaltyMin action_type
10 1 1 1 10 01 1 0 0 0 0 Goal
11 1 1 1 02 02 1 0 0 0 0 Goal
27 1 2 2 20 02 1 0 0 0 0 Goal
28 1 1 1 08 45 1 0 0 1 2 Penalty
</code>
Går det här att göra?Sv: Räkna aktiva utvisningar
Jag skulle nog se över databasdesignen om den inte är låst redan. Det som inte är så lämpligt är att spara två helt olika entiter i samma tabell, i ditt fall mål och utvisningar. Visserligen har de viss information gemensamt (klockslag, match id, ...) eftersom de båda är händelser i en viss specifik match, men de har också information som de inte delar (utvisningstid, assist m m).
Eftersom de trots allt delar viss information t ex klockslag så är det kanske vettigt att ha en tabell som innehåller händelser (Event) där man sparar klockslaget, GameID o s v, men också ett EventTypeID där 1 kan vara matchstart, 2 kan vara mål, 3 kan vara utvisning, 4 kan vara periodslut/halvtidspaus o s v. Sedan lagrar man lämpligen målen i en tabell, utvisningarna i en annan o s v.
Jag är också lite tveksam till uppdelningen av tiden i minuter och sekunder. Jag skulle nog hellre sparat det i ett fält, med sekunder eftersom det gör saken lättare när du skall ta reda på om något inträffar inom ett visst tidsinterval (i detta fall om ett mål sker medans en utvisning fortfarande är aktiv). Att räkna om sekunder till minuter/sekunder är ju enkelt med heltalsdivision och modulusoperationen.
Låt säga att du sparade alla tider i sekunder, då skulle du kunna göra så här för att hämta ut aktiva utvisningar (pseudo) :
select * from Utvisningar where time>=penaltytime and time<=penaltytime+penaltylength and penaltylength between 2 and 5
Time är alltså tiden i sekunder då frågan ställs, dvs t ex tiden då ett mål inträffade.OBS! Antalet sekunder från matchstart!
Penaltytime är tiden i sekunder då utvisningen tog sin början. OBS! Antalet sekunder från matchstart!
Penaltylength är längden på utvisningen i sekunder
Med rätt design på databasen blir alltså frågorna oftast enklare också. Det hjälper ju dock inte dig just nu om du inte vill göra om databasen...
Det går givetvis att lösa med din nuvarande databasdesign också, men det kräver lite mer räknande framförallt med att omvandla tiderna till sekunder. Typ (återigen lite pseudo, med inte helt korrekta fältnamn):
select * from Utvisningar where (timeMin*60+timeSec)<(penaltyTimeMin*60+penaltyTimeSec)+penaltylength*60 and penaltylength between 2 and 5 and actionType='Penalty'
Sparar du 2+2 utvisningar som två poster måste du dock se till att starttiden för den andra utvisningen justeras med två minuter...
Hur hanterar du tider i andra halvlek/period? Börjar du om på noll här? I sådana fall måste du justera ovanstående SQL-sats med periodens nummer*priodens längd i sekunder. Och gör du på det viset måste du också se upp med förlängningar på en enskild period (det kan väl inträffa i fotboll men vet inte hur det fungerar i innebandy) för då har ju inte varje period/halvlek en fix längd.
Jag stannar här så länge och inväntar lite respons på vad jag skrivit innan jag krånglar till det ytterligare för dig... :-)
Lycka till...Sv:Räkna aktiva utvisningar
Gör man på det sättet så behöver man bara lägga till ett villkor till i WHERE-uttrycket som ignorerar strukna utvisningar som ströks före det aktuella klockslaget. Tror jag...utan att funderat alltför djupt på det :-)Sv:Räkna aktiva utvisningar
Per >> Jag trodde att jag kommit på en bra lösning men sen kom jag på att det fanns fler vilkor. Tex att om ett lag redan har två utvisade spelare och får en till utvisning börjar inte tiden för den tredje att räknas förrän den första är slut. ex. utv1 efter 12.00, utv2 efter 13.00, utv3 efter 14.00. utv börjar då räknas 14.00
Tiderna ser ut så här
I första perioden 00.00 till 20.00
Andra perioden 20.00 - 40.00 o.s.v
2+2 sparas som två uitvisningar
Ska fortsätta jobba med det här och se om jag kommer på något bra sätt. Kanske får göra om databasdesignen också.
Har också funderat på att sätta en flagga på utvisningen om det blir mål. Problemet med det är att användarna gör fel ganska ofta. Tex skriver in 2 mål istället för ett eller skriver in det i fel periodSv: Räkna aktiva utvisningar
Mitt råd är precis som Pers - designa om databasen. Det kommer göra frågorna enklare, och snabbare. Det kommer också göra det enklare att uppdatera databasen i framtiden om man kommer på att man även vill ta hänsyn till fotbollsmatcher eller något annat.
tex (enbart snabbt och utan större eftertanke... men det borde fungera, även om den kanske går att normalisera mera, och allt kanske inte är intressant för dig just nu...)
tblMatch
id
teamId1
teamId2
datum
annan intressant info...
tblEvent
id
matchId
ort
rinknamn
annan intressant info...
tblTeam
id
Namn
Hemmarink
hemort
annan intressant info...
tblGoals
Id
MatchId
TeamId
TimeInSec
playerId
PlayerIdAss1
PlayerIdAss2 (om det aldrig kan finnas mer än 2 assisterande, annars får du göra en lösning med relationstabeller)
annan intressant info...
tblPlayer
Id
Name
TeamId (om du vill kunna komma ihåg bakåt vilket lag de spelade för bör du lägga till även:
FromDate (du behöver inte Tom, då en person bara kan spela åt ett lag, dvs bara att ta det senaste from-datumet)
annan intressant info...
tblPenalty
Id
PlayerId
TimeInSec
PenaltyTimeInSec
annan intressant info...
/EmmaSv:Räkna aktiva utvisningar
Förra året hade jag en tabell med utvisningar och en med mål. I år har jag tänkt lägga in lite mer matchfakta.
Målvakt in/ut
Straffar
Matchstart/periodstart
Periodslut/matchslut
Ska jag köra en tabell för varje sak eller kan man lägga den infon i samma och lägga mål/utvb i olika tabeller?
Skulle även vilja ha ett förslag på hur jag kan lösa det med tiderna
Tex att om ett lag redan har två utvisade spelare och får en till utvisning börjar inte tiden för den tredje att räknas förrän den första är slut. ex. utv1 efter 12.00, utv2 efter 13.00, utv3 efter 14.00. utv börjar då räknas 14.00.
Men om motståndarna gör mål efter 13.20 då ska den tredje utvisningen börja räknas 13.20Sv: Räkna aktiva utvisningar
Vill du göra det lätt för dig så lagrar du tiden för utvidningens start OCH slut. då blir det inte bara möjligt utan också lätt att ta fram infon... sedan kan du ju dessuotm lagra tupen av utvisning, om du vill ha statisitk på det.. tex vanlig 2:minutare, 2x2, 5, 10, matchstraff... etc...Sv:Räkna aktiva utvisningar
Problemet är när det är fler än två utvisningar samtidigt
tex att om ett lag redan har två utvisade spelare och får en till utvisning börjar inte tiden för den tredje att räknas förrän den första är slut. ex. utv1 efter 12.00, utv2 efter 13.00, utv3 efter 14.00. utv3 får då starttiden 14.00
men gör motståndarna mål efter 13.20 ska den tredje utvisningen få starttiden 13.20 och inte 14.00
Några tips på hur jag fixar detSv: Räkna aktiva utvisningar
Du kan tex ha väntande utvisningar, då får du ju statistik på det oxå...
Å när en en utvisning är klar, så kollar du om det finns några väntande, å då startar du utvisningstiden.
Då får du tre tidsvärden i databasen. Tid för utvsining, tid för påbörjat straff, tid för avslutat straff.
I de allra flesta fallen blir ju tid för utvisning och tid för påbörjat straff samma, men inte när det är kö..
/M