Avatar billede funkyloonie Nybegynder
07. januar 2003 - 01:12 Der 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'"
Avatar billede 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'"
Avatar billede Slettet bruger
07. januar 2003 - 01:17 #2
Argh undskyld så ikke der var forskel på din WHERE betingelse. Glem ovenstående.
Avatar billede niceday Nybegynder
07. januar 2003 - 01:32 #3
De kan ikke slås sammen i EN da, der er forskel på WHERE, som jo er en brgrænser.

Have a nice day !
Avatar billede avlund Nybegynder
07. januar 2003 - 01:57 #4
Øh...?

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'
Avatar billede tipsen Nybegynder
07. januar 2003 - 01:58 #5
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.
Avatar billede tipsen Nybegynder
07. januar 2003 - 01:59 #6
avlund: pointswinner vs. pointsloser...
Avatar billede avlund Nybegynder
07. januar 2003 - 02:00 #7
Gaaa, jeg er for træt. Ja, selvfølgelig, min fejl.
Avatar billede funkyloonie Nybegynder
07. januar 2003 - 02:04 #8
SetId  MId  PointsWinner  PointsLoser  MatchId  Winner  Loser  Date  Year 
1 1 15 5 1 1 2 101 2003
2 1 13 15 1 1 2 101 2003
3 1 15 1 1 1 2 101 2003
4 2 17 15 2 2 1 106 2003
5 2 15 8 2 2 1 106 2003
6 3 15 9 3 1 2 101 2002
7 3 15 6 3 1 2 101 2002
8 4 15 5 4 2 1 127 2001
9 4 15 8 4 2 1 127 2001
10 5 15 1 5 1 2 303 2002
11 5 15 11 5 1 2 303 2002
12 6 15 11 6 2 1 303 2002
13 6 15 2 6 2 1 303 2002

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...
Avatar billede 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.
Avatar billede jakoba Nybegynder
07. januar 2003 - 02:36 #10
lidt usikker, men prøv med denneher:

$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

";

mvh JakobA
Avatar billede jakoba Nybegynder
07. januar 2003 - 02:39 #11
overflødigt kompliceret. ingen grund til at doble Sett tabellen:

$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 = s1.MId
";
Avatar billede tipsen Nybegynder
07. januar 2003 - 02:50 #12
...sad med de vildeste IF-betingelser - men det er jo meget smart bare at gange med 0 el. 1 som er udfaldet af den logiske test... - smart jakoba :-)
Avatar billede Slettet bruger
07. januar 2003 - 02:58 #13
Ja det er samte smart, troede ikke indholdet af SUM(..) blev evalueret for hver række. Men det bør det vel.

Så kan man diskutere om det er pænere :)
Avatar billede Slettet bruger
07. januar 2003 - 02:59 #14
"satme smart" - skulle der stå.
Avatar billede jakoba Nybegynder
07. januar 2003 - 03:03 #15
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 :-))
Avatar billede 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)
Avatar billede jakoba Nybegynder
07. januar 2003 - 03:33 #17
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
Avatar billede 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 ...
Avatar billede jakoba Nybegynder
07. januar 2003 - 03:52 #19
Det er jeg ret sikker på ikke ville virke, SUM() forudsætter en gruppering som ikke er udefineret hvis IF er udenom.
Avatar billede jakoba Nybegynder
07. januar 2003 - 03:53 #20
Ups.  som ikke er  ->  som er
Avatar billede funkyloonie Nybegynder
07. januar 2003 - 12:09 #21
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.
Avatar billede funkyloonie Nybegynder
07. januar 2003 - 12:16 #22
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
Avatar billede 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)

Virker denne?
Avatar billede funkyloonie Nybegynder
07. januar 2003 - 15:06 #24
mercur8, den virker også. jeg kan dog ikke lige skrive den om til at lægge s1points og s2points sammen, som jeg gjorde med jakoba's.
Avatar billede jakoba Nybegynder
07. januar 2003 - 16:33 #25
har du prøvet:

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 :)

mvh JakobA
Avatar billede jakoba Nybegynder
07. januar 2003 - 16:35 #26
Nej, den der tredie  SUM linie duer vist ikke :(
Avatar billede funkyloonie Nybegynder
07. januar 2003 - 16:37 #27
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.
Avatar billede jakoba Nybegynder
07. januar 2003 - 16:53 #28
hmm
    SUM( ( IF(Game.Winner=$id, Sett.PointsWinner, 0) )
        + ( IF(Game.Loser=$id, Sett.PointsLoser, 0) ) ) AS allepoints
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester