Jag har den här sqlfrågan som ska visa en hockeytabell. Jag tror inte att du har gjort något fel. Det verkar vara en konstighet i variabelhanteringen i MySQL. Kan ge ett exempel på hur det blir. Felet om jag förstår det rätt är att du inte får använda variablerna (som du tilldelar i SQL-satsen) på högersidan i uttryck eftersom dessa inte är satta korrekt vid tidpunkten för uträkningen. Om jag tolkar det rätt får du föregående rads värde i alla uträkningar. Tack för hjälpen. Nu fungerar det hittade det här i manualenhjälp med sql-fråga
Allt fungerar bra förutom Målskillnad, Förluster och poäng.
Tabellerna ser ut så här
s_deltagande_lag
Id
Namn
Serie_ID
s_matcher
Id
Serie_ID
Lagid_a
lagid_b
Resultat_a
resultat_b
Frågan ser ut så här
<code>
SELECT s_deltagande_lag.ID, Namn,s_deltagande_lag.serie_ID,
@games := Count(s_matcher.ID) AS games,
@win := Sum((s_deltagande_lag.ID=lagid_a And resultat_a > resultat_b )Or (s_deltagande_lag.ID=lagid_b And resultat_a<resultat_b)) AS win,
@tie := Sum(resultat_a=resultat_b) AS tie,
@games - @win - @tie as lost ,
@win*2 + @tie AS poang,
@plus := Sum((s_deltagande_lag.ID=lagid_a)*resultat_a + (s_deltagande_lag.ID=lagid_b)*resultat_b) as plus,
@minus := Sum((s_deltagande_lag.ID=lagid_a)*resultat_b + (s_deltagande_lag.ID=lagid_b)*resultat_a) as minus,
@plus - @minus as plusminus
FROM s_deltagande_lag LEFT JOIN s_matcher ON (s_deltagande_lag.ID=lagid_a) Or (s_deltagande_lag.ID=lagid_b)
where s_deltagande_lag.serie_ID = 2
GROUP BY ID, Namn
</code>
Problemet är att den inte räknar rätt på poang, plusminus och lost.
Sorterar jag efter tex namn och Alingsås kommer först. Då skrivs alingsås poäng, plusminus och förluster ut på alla lag.
Någon som kan se vad som är fel?Sv: hjälp med sql-fråga
Det finns en sak som är gemensam för de tre fält du har problem med:
De utgörs alla av uttryck av endast användardefinierade variabler.
I MySQLs manual står något som antagligen har med detta att göra:
<quote>
Note: in a SELECT statement, each expression is evaluated only when it's sent to the client. This means that in the HAVING, GROUP BY, or ORDER BY clause, you can't refer to an expression that involves variables that are set in the SELECT part. For example, the following statement will NOT work as expected:
<code>
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
</code>
The reason is that @aa will not contain the value of the current row, but the value of id for the previous accepted row.
The rule is to never assign and use the same variable in the same statement.
</quote>
Jag har dock inte förstått ännu vad det är som händer.
Lösningen för dig är nog att göra beräkningarna i PHP efter att du har hämtat lämpliga fält.Sv: hjälp med sql-fråga
Alingsås 1 vinst 5 oavgjorda 4 förluster 5 plusmål 67 minusmål plusminus -62 7 poäng
Då får alla lag andra lag också samma värden på förluster, plusminus och poäng
Tibro 9 vinster 1 oavgjorda 4 förluster 45 plusmål 22 minusål plusminus -62 7 poäng
Jag hade tänkt göra uträkningarna i asp.net koden men eftersom jag vill sortera posterna efter poäng, plusminus och plusmål gjorde jag så här.Sv: hjälp med sql-fråga
Tre kolumner får du problem med : lost, poang och plusminus, eftersom dessa baserar sig på andra kolumners värden. Fungerar det att skriva kolumnnamnen i stället för variabelnamnen där? Dvs du kan skippa alla variabler och bara skriva :
<code>
SELECT s_deltagande_lag.ID, Namn,s_deltagande_lag.serie_ID,
Count(s_matcher.ID) AS games,
Sum((s_deltagande_lag.ID=lagid_a And resultat_a > resultat_b )Or (s_deltagande_lag.ID=lagid_b And resultat_a<resultat_b)) AS win,
Sum(resultat_a=resultat_b) AS tie,
games - win - tie as lost ,
win*2 + tie AS poang,
Sum((s_deltagande_lag.ID=lagid_a)*resultat_a + (s_deltagande_lag.ID=lagid_b)*resultat_b) as plus,
Sum((s_deltagande_lag.ID=lagid_a)*resultat_b + (s_deltagande_lag.ID=lagid_b)*resultat_a) as minus,
plus - minus as plusminus
FROM s_deltagande_lag LEFT JOIN s_matcher ON (s_deltagande_lag.ID=lagid_a) Or (s_deltagande_lag.ID=lagid_b)
where s_deltagande_lag.serie_ID = 2
GROUP BY ID, Namn
</code>
Om inte detta fungerar så finns det iallafall tre andra sätt att lösa det på :
1) Stored Procedure...
2) Strunta i kolumnerna lost, poang och plusminus och räkna ut detta i koden i efterhand. Sorteringen på dessa kolumner måste i såfall också göras i koden.
3) Klipp och klistra lite. Plus är ju :
<code>
Sum((s_deltagande_lag.ID=lagid_a)*resultat_a + (s_deltagande_lag.ID=lagid_b)*resultat_b)
</code>
och minus är :
<code>
Sum((s_deltagande_lag.ID=lagid_a)*resultat_b + (s_deltagande_lag.ID=lagid_b)*resultat_a)
</code>
så plusminus är väl då rimligen :
<code>
Sum((s_deltagande_lag.ID=lagid_a)*resultat_a + (s_deltagande_lag.ID=lagid_b)*resultat_b) - Sum((s_deltagande_lag.ID=lagid_a)*resultat_b + (s_deltagande_lag.ID=lagid_b)*resultat_a)
</code>Sv: hjälp med sql-fråga
Fungerar stored procedures i mysql?
I så fall. Hur skapar och använder man stored procedures?Sv: hjälp med sql-fråga
"Our aim is to have stored procedures implemented in MySQL Server around version 5.0."
Så det verkar inte fungera med Stored procedures i mysql än