Avatar billede heyde Nybegynder
20. juli 2003 - 20:53 Der er 8 kommentarer og
1 løsning

Hjælp med kompliceret select-sætning

Hej,
Jeg har denne select-sætning, som desværre giver mig lidt problemer.

'NYESTE PROFILER
strSQL = "SELECT person.spillerID, person.fornavn, person.efternavn, person.positionID, position.navn AS position,"
strSQL = strSQL & " nationalitet.nationalitetID, nationalitet.navn AS landenavn, person.nationalitetID,"
strSQL = strSQL & " division.navn AS division, jobID, køn.navn AS sex"
strSQL = strSQL & " FROM"
strSQL = strSQL & " person, position, nationalitet, klubdiv, division, køn"
strSQL = strSQL & " WHERE"
strSQl = strSQL & " person.kønID = køn.KønID AND"
strSQL = strSQL & " person.positionID = position.positionID AND"
strSQL = strSQL & " person.nationalitetID = nationalitet.nationalitetID AND"
strSQL = strSQL & " person.spillerID = klubdiv.SpillerID AND"
strSQL = strSQL & " klubdiv.divisionID = division.divisionID"
strSQL = strSQL & " ORDER BY person.spillerID DESC LIMIT 5"

Jeg trækker følgende data ud senere i min kode:
landenavn, nationalitetID, spillerID, fornavn, efternavn, position, division, sex

Oplysninger om spillere er gemt i "person"
Oplysninger om klubber er gemt i "klub"
Oplysninger om hvilke spillere der er i hvilke klubbber er gemt i "klubdiv"

Sætningen giver ikke nogle fejl, men problemet er, at jeg ikke får nogle spillere uden klub ud fra listen. Grunden er at jeg laver relationerne "person.spillerID = klubdiv.spillerID" og "klubdiv.klubID = klub.klubID". De gør at en spiller SKAL have et klubID som eksisterer i listen over klubber.

Er der nogen der har et forslag til hvordan jeg kan hive samtlige spillere ud af databasen - også dem der slet ikke er nævnt i klubdiv-tabellen?
Jeg har overvejet om man kan lave en endnu en select sætning længere nede - måske inde i "do while not rs.eof" løkken, hvor dataene bliver brugt.

Er det helt sort snak? Så skriv lige, så prøver jeg at forklare det bedre...
Avatar billede eagleeye Praktikant
20. juli 2003 - 20:56 #1
Hvad ønsker du ud?

Som jeg læser det vil du havde alle spillere ud og hvis der er en klub til den spiller skal det med ud?
Avatar billede heyde Nybegynder
20. juli 2003 - 21:03 #2
ja, lige præcis (og også divisionID som også bliver gemt i klubdiv, men det er jo ligemeget) :)
Avatar billede eagleeye Praktikant
20. juli 2003 - 21:16 #3
Hvis man skulle lave en SELECT som henter alle de ting du har i de forskellige tabellen (køn/divition/mf) så ville man lave det med JOIN af de forskellige tabeller for at styre hvordan se forskellige hænger sammen og link data rigtigt samme. Så din SQL vil se sådan her ud:


Princippet er man starter med udgangspunktet som er person tabellen og JOINer en tabel på efter ad gangen.


strSQL = "SELECT person.fornavn, person.efternavn, position.navn, nationalitet.navn, klub.navn, division.navn, køn.navn
FROM (((((person LEFT JOIN position ON person.positionID = position.positionID) LEFT JOIN nationalitet ON person.nationalitetID = nationalitet.nationalitetID) LEFT JOIN klubdiv ON person.spillerID = klubdiv.SpillerID) LEFT JOIN køn ON person.kønID = køn.kønID) LEFT JOIN division ON person.divisionID = division.divisionID) LEFT JOIN klub ON klubdiv.klubID = klub.klubID ORDER BY person.spillerID DESC LIMIT 5;"
Avatar billede eagleeye Praktikant
20. juli 2003 - 21:20 #4
hov jeg har fået lagt divisionID kolonnen ind i person tabellen den før viste SQL så prøv men denne hvor kolonne divisionID er i klubdiv tabellen:


strSQL = "SELECT person.fornavn, person.efternavn, position.navn, nationalitet.navn, klub.navn, division.navn, køn.navn
FROM (((((person LEFT JOIN position ON person.positionID = position.positionID) LEFT JOIN nationalitet ON person.nationalitetID = nationalitet.nationalitetID) LEFT JOIN klubdiv ON person.spillerID = klubdiv.SpillerID) LEFT JOIN køn ON person.kønID = køn.kønID) LEFT JOIN klub ON klubdiv.klubID = klub.klubID) LEFT JOIN division ON klubdiv.divisionID = division.divisionID ORDER BY person.spillerID DESC LIMIT 5;"
Avatar billede heyde Nybegynder
20. juli 2003 - 21:35 #5
JA! Det virker!
Jeg har kun leget med INNER JOINS, og er stadig ikke helt med på hvorfor JOINS er bedre end "normale" x=x relationer.

Skriv lige et svar, og gerne en lille forklaring om LEFT/INNER JOINS, så får du nogle velfortjente point :)
Avatar billede eagleeye Praktikant
20. juli 2003 - 22:19 #6
En forkalring. Man sætte tabeller sammen eller henter data fra en anden tabel og sætter sammen med den første tabel. Eks men to tabeller.

person
Navn  KlubID
Ole    4


I klub tabellen kan man som du ved havde alle klubber.
Klub
ID navn
1  OB
2  Aab
3  Brøndby
4  Vejle

osv Det man gør med JOIN på den måde er at hedte alle de records fra klub tabellen hvor person tabllens klubID er lig med klub tabellens id :
SELECT person.navn, klub.navn FROM person LEFT JOIN klub ON person.klubID = klub.ID

Så får man dette ud:
personnavn klubnavn
Ole        Vejle


Eller måske denne kan hjælpe lidt mere:
http://www.w3schools.com/sql/sql_join.asp
Avatar billede heyde Nybegynder
20. juli 2003 - 22:46 #7
hmm... Jeg glemte vist lige en vigtig detalje :(

Et personID kan godt stå flere gange i klubDIV, da man også kan have tidligere klubber (så er nuværende = 0, ellers er nuværende = 1).

Det betyder nu at den samme person kommer frem flere gange i den samme søgning. Har du også en smart måde at undgå dette på?
Avatar billede eagleeye Praktikant
20. juli 2003 - 22:53 #8
Hvis du ikke vil havde klub navnet ud kan du tilføje: distinct  efter select for kun at vælge personen en gang, hvis du vil havde nuværende klub nanv med så tilføj en WHERE hvor nuværende=1 og nuværende er Null

WHERE (((klubdiv.nuværende)=1 Or (klubdiv.nuværende) Is Null))
Avatar billede eagleeye Praktikant
20. juli 2003 - 22:54 #9
men WHERE på

strSQL = "SELECT distinct person.fornavn, person.efternavn, position.navn, nationalitet.navn, klub.navn, division.navn, køn.navn
FROM (((((person LEFT JOIN position ON person.positionID = position.positionID) LEFT JOIN nationalitet ON person.nationalitetID = nationalitet.nationalitetID) LEFT JOIN klubdiv ON person.spillerID = klubdiv.SpillerID) LEFT JOIN køn ON person.kønID = køn.kønID) LEFT JOIN klub ON klubdiv.klubID = klub.klubID) LEFT JOIN division ON klubdiv.divisionID = division.divisionID WHERE (((klubdiv.nuværende)=1 Or (klubdiv.nuværende) Is Null)) ORDER BY person.spillerID DESC LIMIT 5;"
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
Kurser inden for grundlæggende programmering

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