Avatar billede mshh Nybegynder
24. juni 2002 - 19:58 Der er 8 kommentarer og
2 løsninger

Relationer med PHP og MySQL databaser

Jeg har oprettet 3 tabeller i min MySql-DB som jeg skal bruge til et katalog over foredragsholdere:

Tabel 1 - Foredragsholdere:
Id
Fornavn
Efternavn
Postnummer
By
Telefon

Tabel 2 - Foredragsholdere_kategorier:
Id
Nummer
Kategorinavn

Tabel 3 - Foredragsholdere_relationer:
Id
Foredragsholdere_id
Foredragsholdere_relationer_id

Jeg skal nu kunne hente navn mv. for de foredragsholdere, der kan holde foredrag om en givet kategorinummer (kategori). Hvordan gør jeg så lige det? Desuden skal det være muligt at søge således, at man fx. kun får vist foredragsholdere med bopæl i postnummer området 8000 til 8200.

Svaret skal være rimelig præcis, da jeg aldrig har prøvet det før, og er HELT på bar bund. Derfor vil der muligvis komme supplerende spørgsmål...
Avatar billede trayzor Nybegynder
24. juni 2002 - 23:19 #1
SELECT foredragsholdere.*, foredragsholdere_kategorier.kategorinavn FROM foredragsholdere, foredragsholdere_kategorier, foredragsholdere_relationer WHERE foredragsholdere_relationer.foredragsholdere_id=foredragsholdere.id AND foredragsholdere_kategorier.kategorinavn='lystfiskeri'

Der mangler en AND i where clausen da jeg ikke kan se hvad der kæder tabel 3 og tabel 2 sammen?!?!
Avatar billede hansk Nybegynder
25. juni 2002 - 08:33 #2
Prøv at normalisere din db, f.eks. således:

Tabel 1 - Foredragsholdere:
Id
Fornavn
Efternavn
Postnummer
By
Telefon

Tabel 2 - Kategorier:
Id
Kategorinavn

Tabel 3 - Foredragsholdere_Kategorier:
Foredragsholdere_id
Kategorier_id

Så kan du ret enkelt selektere hvad du har brug for således:

SELECT Foredragsholdere.*, Kategorier.*
FROM Foredragsholdere, Kategorier, Foredragsholdere_Kategorier
WHERE Foredragsholdere.id=Foredragsholdere_Kategorier.Foredragsholdere_id
AND Foredragsholdere_Kategorier.Kategorier_id=Kategorier.id
      (her kommer så øvrige udvælgelseskriterier)
AND  Kategorier.id=17
AND  Foredragsholdere.Postnummer between 8000 and 8200

Så er det bare at skifte udvælgelseskriterierne ud med det du har brug for.
Avatar billede mshh Nybegynder
25. juni 2002 - 17:36 #3
Tak for jeres svar, jeg når ikke at kigge på det før senere på ugen - men jeg skal nok vende tilbage med pointuddeling...
Avatar billede mshh Nybegynder
30. juni 2002 - 16:52 #4
>> Hansk: Jeg har nu prøvet at tilrette mine DB. Jeg kan godt "fyre" denne kommando af, men hvordan får jeg et resultat frem på min skærm? Der ser ud til, at man skal bruge noget i retning af ".$row[Foredragsholdere.efternavn]." - men det synes jeg ikke virker?

Hvordan viser jeg en liste med Fornavn, Efternavn og By på de foredragsholdere, der opfylder min SELECT?

PS: Når man reelt ikke forstår hvad din SELECT kommando udfører, så bliver tingene jo lidt vanskelige...Kan du mon forklare det på "almindeligt dansk"? ;-)
Avatar billede trayzor Nybegynder
30. juni 2002 - 20:09 #5
En SELECT sætning henter de data fra tabellerne som svarer til kriterierne angivet i sætningen. Resultatet returneres som et resultatsæt. Det kan du behandle således i php.

$query = mysql_query("SELECT * FROM tablename");

while($row=mysql_fetch_array($query)){

echo $row['kolonnenavn'];
echo $row['andetkolonnenavn'];

}

While løkken køres automatisk en gang for hver række i resultatsættet.
Avatar billede mshh Nybegynder
05. juli 2002 - 19:17 #6
>> TRAYZOR: Jeg er med på hvad en SELECT sætning giver - men den pågældende SELECT hvor man henter fra flere DB på en gang har jeg svært ved at forstå - og derfor ved jeg ikke hvordan resultatsættet kan behandles.
Avatar billede refshauge Nybegynder
05. juli 2002 - 22:03 #7
Når du selecter fra 2 tabeller kan du stadig skrive:
  echo $row['kolonnenavn'];

Eksempel:
select * from tabelA, tabelB where tabelA.id=tabelB.Aid
  echo $row['kolonnenavn']; (udskriver en kolonne fra tabelA)
  echo $row['kolonnenavn2']; (udskriver en kolonne fra tabelB)

Problemet opstår først når du har 2 kolonner i de 2 tabeller som hedder det samme (f.eks. ID), så er du nødt til at gøre følgende:

select *, tabelA.id as Aid, tabelB.id as Bid from tabelA, tabelB where tabelA.id=tabelB.Aid
  echo $row['kolonnenavn']; (udskriver en kolonne fra tabelA)
  echo $row['kolonnenavn2']; (udskriver en kolonne fra tabelB)
  echo $row['Aid']; (udskriver id fra tabelA)
  echo $row['Bid']; (udskriver id fra tabelB)

Iøvrigt forstår jeg ikke hvorfor hansk siger at du skal "normalisere" dine tabeller. Jeg kan ikke se at man vinder noget ved at omdøbe nogle tabeller og feltnavne. Det eneste det giver er en database, som er sværere at finde rundt i, hvis der er mange tabeller. Før hed tabellerne nemlig alle noget med "foredragsholdere" :-)

mshh: Held og lykke med projektet !
Avatar billede trayzor Nybegynder
06. juli 2002 - 03:47 #8
Hvad angår normaliseringen er den vist god nok.. har dog ikke indblik i virkeligheden db'en skal afspejle, men som den så ud til at starte med manglede der noget der kædede tabel 2 og 3 sammen...

refshauge: god forklaring...
Avatar billede refshauge Nybegynder
06. juli 2002 - 06:44 #9
OK du har ret m.h.t. sammenkædningen af tabel 2 og 3. Jeg havde læst følgende (troede jeg):

Tabel 3 - Foredragsholdere_relationer:
Id
Foredragsholdere_id
Foredragsholdere_kategorier_id

Havde dette været tilfældet havde det for mig at se været 10-4
Avatar billede mshh Nybegynder
06. juli 2002 - 12:55 #10
Tak for jeres svar - jeg vil "kæmpe" lidt videre.

Håber denne point-fordeling kan accepteres...
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