07. januar 2003 - 01:12Der er
26 kommentarer og 2 løsninger
Optimering af sql
Jeg har to sql'er som næsten er ens og virker fint. Jeg synes nu at det vil være pænere hvsi de blev slået sammen til en. Er det muligt?
"SELECT SUM(Sett.PointsWinner) AS points FROM Game, Sett WHERE Game.MatchId=Sett.MId AND Game.Winner='$id'" og "SELECT SUM(Sett.PointsLoser) AS points FROM Game, Sett WHERE Game.MatchId=Sett.MId AND Game.Loser='$id'"
Skal virksomheder stå stærkere mod angreb og kunne udvikle sig, skal sikkerhed, drift og forretning tænkes sammen. Det er tanken bag Jysk IT’s ambition om at skabe en “sikker fremtid” for kunderne.
Slettet bruger
07. januar 2003 - 01:16#1
SELECT SUM(Sett.PointsWinner) AS points_winner, SUM(Sett.PointsLoser) AS points_loser FROM Game, Sett WHERE Game.MatchId=Sett.MId AND Game.Loser='$id'"
Synes godt om
Slettet bruger
07. januar 2003 - 01:17#2
Argh undskyld så ikke der var forskel på din WHERE betingelse. Glem ovenstående.
SELECT SUM(Sett.PointsWinner) AS points FROM Game, Sett WHERE (Game.MatchId=Sett.MId AND Game.Winner='$id') OR Game.MatchId=Sett.MId AND Game.Loser='$id'
Tror egentlig godt de kan slås sammen - men funkyloonie prøv lige at smid en 5-10 rækker med data fra tabellen og forklar, hvad du ønsker af output - har måske en ide, men vil gerne se data fra tabellen for at se om det er muligt.
Her er det testdata jeg sidder med. Det skal siges at det er lagring af data fra badmintonskampe. Jeg vil have alle de points som en person har scoret i de kampe som personen har spillet. dvs det er både fra PointsLoser og PointsWinner man skal have point fra da man jo ikke altid vinder...
Synes godt om
Slettet bruger
07. januar 2003 - 02:09#9
Jeg ser heller ikke, at du kan samle det i en forspørgsel, med dit nuværende databasedesign.
$sql_kommando = " SELECT SUM(s1.PointsWinner * ( Game.Winner='$id' ) ) AS s1points, SUM(s2.PointsLoser * ( Game.Loser='$id' ) ) AS s2points FROM Game, Sett AS s1, Sett AS s2 WHERE Game.MatchId = s1.MId AND Game.MatchId = s2.MId
og især kan man diskutere om det er hurtigere :( som den står nu vil den vist søge at lave SUM evaluering på hver eneste række i den totale join, det kan nok betale sig at begrænse det lidt
$sql_kommando = " SELECT SUM(Sett.PointsWinner * ( Game.Winner=$id ) ) AS s1points, SUM(Sett.PointsLoser * ( Game.Loser=$id ) ) AS s2points FROM Game, Sett WHERE Game.MatchId = Sett.MId AND ( Game.Winner=$id OR Game.Loser=$id ) ";
( så fik jeg også lejlighed til at fjerne de misvisende apostroffer omkring $id :-))
Synes godt om
Slettet bruger
07. januar 2003 - 03:09#16
Vil det her så give samme resultat?:
SELECT SUM(IF(Game.Winner=$id, Sett.PointsWinner, 0)) AS s1points, SUM(IF(Game.Loser=$id, Sett.PointsLoser, 0)) AS s2points FROM Game, Sett WHERE Game.MatchId = Sett.MId AND Game.Winner=$id OR Game.Loser=$id
Altså, hvis indholdet af SUM evalueres for hver række så gør IF betingelsen vel også?
(Og vi er enige om at sidste WHERE betingelse bare er for optimeringens skyld - tror vi)
Det er ihvertfald en renere måde at skrive det på. men jeg tør ikke udtale mig om om det virker med at summe på en if i mysql, lad os håbe funkyloonie rapporterer tilbage
Synes godt om
Slettet bruger
07. januar 2003 - 03:47#18
Jeg er meget i tvivl om brugen af de expressions i mysql, men man lærer jo en masse nyt her.
Ville: SELECT IF(Game.Winner=$id, SUM(Sett.PointsWinner), 0) AS s1points,
Montro være det samme som: SELECT SUM(IF(Game.Winner=$id, Sett.PointsWinner, 0)) AS s1points,
??
Osv. Nu ved jeg ihvertfald, hvad jeg skal læse lidt mere om ...
Hej igen. Jeg var gået i seng ca 2.30 i nat så derfor følger jeg først op på mit spg nu. jakoba du har lavet den rigtige løsning og derfor vil jeg gerne give dig points. Vær venlig at give et svar. Mercur8, din sql giver ikekdet rigtige til s2points.
Jeg har lige optimeret sql'en så den lægger dem sammen. Tak for hjælpen igen. :)
SELECT SUM((Sett.PointsWinner * ( Game.Winner='1') + (Sett.PointsLoser * ( Game.Loser='1' ) )) ) AS s1points FROM Game, Sett WHERE Game.MatchId = Sett.MId
Synes godt om
Slettet bruger
07. januar 2003 - 14:55#23
funkyloonie, prøv lige:
SELECT SUM(IF(Game.Winner=$id, Sett.PointsWinner, 0)) AS s1points, SUM(IF(Game.Loser=$id, Sett.PointsLoser, 0)) AS s2points FROM Game, Sett WHERE Game.MatchId = Sett.MId AND (Game.Winner=$id OR Game.Loser=$id)
SELECT SUM(IF(Game.Winner=$id, Sett.PointsWinner, 0)) AS s1points, SUM(IF(Game.Loser=$id, Sett.PointsLoser, 0)) AS s2points, SUM( s1points + s2points ) as total FROM Game, Sett WHERE Game.MatchId = Sett.MId AND (Game.Winner=$id OR Game.Loser=$id)
Hvis det er muligt vil jeg anbefale at du bruger merku8's IF sætninger. det er mere forståelig kode :)
Det jeg har prøvet er at slå "SUM(IF(Game.Winner=$id, Sett.PointsWinner, 0)) AS s1points,SUM(IF(Game.Loser=$id, Sett.PointsLoser, 0)) AS s2points" sammen til en SUM(...). Det er dog ikke lykkedes.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.