24. marts 2006 - 06:22Der er
7 kommentarer og 1 løsning
Join mellem 3 tabeller
Join mellem 3 tabeller 30 point fra steka
X 3 aftener og jeg må give op.
Jeg har 3 tabeller
1) vis double: indeholder een række med summen af de to spilleres resultat, nøgle hold nummer. 2) players: indeholder alle spillere (hold nummer findes) 3) results: indeholder alle resultater spillerne har præsteret (hold nummer findes)
nøgle mellem players og results er spiller nummer.
Hvordan pokker joiner jeg så resultatet på skærmen er:
Hold 1 Spiller 1 .....resultat .... placering Hold 1 Spiller 2 .....resultat .... (placering) Hold 2 Spiller 1 .....resultat .... placering osv.
Jeg har forsøgt mig med:
$sql = mysql_query("SELECT DISTINCT * FROM players, results right join visdouble on felt1=results.rteam WHERE players.pno = results.rno and results.sdt like 'double' and players.group LIKE '$_GET[kon]%' ORDER BY felt2 desc, felt3 desc, total desc , pins DESC, visdouble.id ASC ") or die(mysql_error());
[kon] dækker over hvilken gruppe den enkelte spiller deltager i.
Kan måske klares ved at indsætte holdets resultat i results, men synes det kunne være lækkert (og lærerigt) at bruge join muligheden.
Mit problem opstår ved felt1 dteam rteam fordi en spiller i en lavere række altid spiller sammen med den spiller der er placeret i den højeste række blandt holdets spillere.
tabel: visdouble Dannes ved sidens åbning og indeholder summen holdets score
*1* felt1 varchar(4) holdnr felt2 int(11) sum score felt3 int(11) sum score+hcp id mediumint(9) indsættes efter create til at danne placering
tabel: players
*2* pno mediumint(9) spiller nummer name varchar(100) group varchar(10) phcp smallint(2) handicap *1* dteam varchar(4) holdnr (*1*) tteam varchar(4) holdnr (benyttes i anden diciplin)
Indekser : pno
tabel: results
plac mediumint(4) *2* rno mediumint(6) spiller nummer sdt varchar(6) diciplin rhcp mediumint(3) handicap mhcp smallint(3) handicap *1* rteam varchar(4) holdnr
+ INFOrækker
Indekser : rno
Herunder mit foreløbige resultat, men disse spillere tilhører alle samme række.
Plac Team Name Country Group Event HCP S1 S2 S3 S4 S5 S6 PINS ∑HCP TOT X / 1 d3 Ritva Lieto Finland Ladies C Double 12 0 0 0 0 0 0 0 72 0 0 0 156 0 1 d3 Kirsti Nurmela Finland Ladies C Double 14 0 0 0 0 0 0 0 84 0 0 0 156 0 2 D1 Leida Zwep Netherlands Ladies C Double 7 0 0 0 0 0 0 0 42 0 0 0 132 0 2 D1 Nel Buis Netherlands Ladies C Double 15 0 0 0 0 0 0 0 90 0 0 0 132 0 3 D2 Jos Hurenkamp Netherlands Ladies C Double 4 0 0 0 0 0 0 0 24 0 0 0 72 0 3 D2 Joke Gerwen Netherlands Ladies C Double 8 0 0 0 0 0 0 0 48 0 0 0 72 0
dteam er hold nummer i players tabellen rteam er hold nummer i results tabellen felt1 er dteam i visdouble efter denne select: INSERT INTO visdouble SELECT distinct dteam, sum(s1+s2+s3+s4+s5+s6+sumhcp)/2,sum(s1+s2+s3+s4+s5+s6)/2 FROM players, results WHERE dteam=rteam and dteam <> \"\" and substring(dteam,1,2) = '$gruppend' AND players.group LIKE '$_GET[kon]%' group by players.dteam
Havde fået det til at virke ved at indsætte en ekstra tabel, men var noget urolig for performance/stabilitet når der skulle oprettes og opdateres to tabeller ved hver forespørgsel.
kon=køn
hvorefter din join ikke behøver en WHERE sætning ved søgning på land indsætter jeg så bare WHERE land = X.
Læser din join derhen: Vælg alle spillere som er i players og results og af dem vælg de spillere som er i visdouble. Hvorfor sætter du egentlig paranteser omkring betingelserne?
visdouble kunne måske gøres mere elegant - men det virker.
Læser din join derhen: Vælg alle spillere som er i players og results og af dem vælg de spillere som er i visdouble.
Ja det er korrekt.
Hvorfor sætter du egentlig paranteser omkring betingelserne?
hmm ja jo det er vist et godt spørgsmål, de er er ikke nødvendige i det tilfælde.
Synes godt om
Ny brugerNybegynder
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.