Avatar billede steka Nybegynder
24. marts 2006 - 06:22 Der 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.
Avatar billede fennec Nybegynder
24. marts 2006 - 09:17 #1
Vi skal have en bedre DB beskrivelse. Noget i denne stil:
[players]
ID = autonummer
Navn = tekst
...

[results]
ID = autonummer
spillerID = tal (ref til players.ID)
resultat = tal
...

Og hvis du kan smide et par linjer data herind fra hver tabel også er det super fedt (specielt hvis data hænger sammen :o)
[players]
1, fennec...

[results]
1, 1, 3
2, 1, 5
Avatar billede fennec Nybegynder
24. marts 2006 - 09:18 #2
Du behøver selevølgelig ikka at give info om ubetydlige kolonner (note, postnr, by osv.) da vi alligevel ikke skal bruge dem...
Avatar billede steka Nybegynder
24. marts 2006 - 17:16 #3
Værs'go

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
Avatar billede steka Nybegynder
25. marts 2006 - 11:55 #4
felt1, dteam og rteam's format er i øvrigt for damespillerne i a-gruppen:

FDA1
FDA1 hold 1 i a-gruppen

FDA2
FDA2 hold 2 i a-gruppen

Problemet opstår når jeg søger på substrengen 'A' (3.karakter).
Avatar billede fennec Nybegynder
27. marts 2006 - 08:35 #5
Den kan jeg desværre ikke lige se hvordan skal klares :(
Avatar billede eagleeye Praktikant
28. marts 2006 - 00:35 #6
Ud fra det du skriver vil jeg umiddelbart sige at JOIN kan se sådan her ud, dog er jeg lidt i tvivl hvad du mener med dteam og tteam??:

SELECT * FROM (players INNER JOIN results ON players.pno = results.rno) INNER JOIN visdouble ON (players.dteam = visdouble.felt1) AND (results.rteam = visdouble.felt1)


Der er ikke en where endnu men det where skal være de ting som ikke er en del af join ledne:

WHERE results.sdt like 'double' and players.group LIKE '$_GET[kon]%'
Avatar billede steka Nybegynder
28. marts 2006 - 19:48 #7
Det virker! Ganske godt gået kl.00:35!

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.

Tak for hjælpen!

Smider du et svar.
Avatar billede eagleeye Praktikant
28. marts 2006 - 20:15 #8
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.
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
Computerworld tilbyder specialiserede kurser i database-management

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