Multidesk.be » Forums » PHP » Het gebruik van SELECT in meerdere tabellen

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door Toine op maandag 26 november 2012 om 15:57:19.
Toine heeft nog geen avatar toegevoegd
Multiviteit: 6
Het probleem:
Ik heb de volgende tabellen:
1) een tabel met naam, adres, woonplaats gegevens van personen met ID als het sleutelveld.
2) een tabel met koppelingen tussen personen Pers1ID en Pers2ID

Hoe maak ik nu een SELECT statement zodat ik deze gegevens van beide personen als één record zie?

Hierbij moet ik nog vertellen dat Pers1ID altijd een waarde heeft terwijl dat bij Pers2ID niet altijd het geval is.

Graag advies

Toine
^ Reactie #1 geschreven door thekid op maandag 26 november 2012 om 18:01:52.
thekid's avatar
Multiviteit: 5273
Moderator
moet je ook de personen zien die geen pers2ID hebben?

je zal een join moeten gebruiken die controleert op de nullwaarde van pers2id
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #2 geschreven door Toine op maandag 26 november 2012 om 18:51:51.
Toine heeft nog geen avatar toegevoegd
Multiviteit: 6
Ik heb wel iets gelezen over de diverse vormen van join, maar ik krijg deze echter voor deze situatie niet werkend

Toine
^ Reactie #3 geschreven door SMG op maandag 26 november 2012 om 20:57:13.
SMG's avatar
Multiviteit: 12000
Moderator
Kan je de situatie wat duidelijker maken? Geef de tabellen en hun kolomnamen eens en zeg waar de joins zitten.

Een join ziet er overigens zo uit:
SELECT *
FROM tbl1 INNER JOIN tbl2 ON (tbl1.ID = tbl2.tbl1ID)

Krijg je alle data uit beide tabellen waar een join is gevonden. Als de gegevens dus niet voorkomen in beide tabellen zullen die dus achterwegen gelaten worden.
Wil je dit gedrag niet, moet je RIGHT OUTER JOIN gebruiken ipv INNER JOIN.

http://www.multidesk.be/bijlage/971e8164fa80706801d9088c5cd413b2.png
Deze tekst werd het laatst bewerkt voor 8.21 % door SMG op maandag 26 november 2012 om 21:04:53.
^ Reactie #4 geschreven door Toine op dinsdag 27 november 2012 om 14:39:20.
Toine heeft nog geen avatar toegevoegd
Multiviteit: 6
Mijn tabel structuur:
Tbl_Persoongegevens:
Velden;
ID = key
Voornaam
TV
Achternaam
Adres
Postc
Plaats

Tbl_Inschrijvingen:
Velden;
InschrID = key
Pers1ID = relatie met 1e persoon uit Tbl_Persoongegevens (heeft altijd een waarde)
Pers2ID= relatie met evt 2e persoon uit Tbl_Persoongegevens (kan ook een NULL waarde hebben)

In mijn optiek zouden er in deze situatie twee joins bestaan:
De 1e met de 1e persoon en de 2e met de 2e persoon

De logica met joins ontgaat mij enigszins, kan je me daarbij helpen?

Toine

Aanvulling

Ik heb het volgende SQL statement in gedachte:

SELECT (Voornaam, TV, Achternaam
FROM Tbl_Persoongegevens INNER JOIN Tbl_Inschrijvingen ON (Tbl_Inschrijvingen.Pers1ID = Tbl_Persoongegevens.ID)), (Voornaam, TV, Achternaam
FROM Tbl_Persoongegevens RIGHT OUTER JOIN Tbl_Inschrijvingen ON (Tbl_Inschrijvingen.Pers2ID = Tbl_Persoongegevens.ID))

Wat vervolgens niet werkt.

De bedoeling is dat ik vanuit Tbl_Inschrijvingen een Query heb die als eindresultaat een record geeft:
Voornaam tussenvoegsel, achternaam Voornaam tussenvoegsel, achternaam
welke ik uit Tbl_Persoongegevens haal.

Zodoende heb ik Tbl_Inschrijvingen de velden Pers1ID en Pers2Id gedefinieerd welke ieder een link heeft naar ID van Tbl_Persoongegevens
m.a.w. Pers1ID=ID voor PersoonA en Pers2ID=ID voor persoonB

Graag advies

Toine

Opmerking van de crew

Gast = Toine
Heb ook je beide berichten even samengevoegd
SMG
Deze tekst werd het laatst bewerkt voor 43.04 % door SMG op woensdag 28 november 2012 om 22:15:18.
^ Reactie #5 geschreven door SMG op woensdag 28 november 2012 om 22:11:05.
SMG's avatar
Multiviteit: 12000
Moderator
Vreemde structuur van databank. Hoe ik het zo voor mij heb heb je dus een tussentabel inschrijvingen om een veel op veel relatie aan te kunnen maken (niets mis mee), maar je maakt in deze tussentabel entries aan waarbij Pers2ID NULL als waarde kan hebben. Wat is daar als reden voor?

Als ik het mij een beetje kan situeren wil je dus een inschrijving tabel maken waarop mensen zich kunnen inschrijven. Op 1 event kunnen meerdere mensen inschrijven en 1 persoon kan zich op meerdere events inschrijven (een veel op veel relaties dus).
Kan je dan niet beter een structuur nemen zoals

Event
====
ID
Naam
...

Inschrijving
========
ID
EventID
PersoonID

Persoon
=====
ID
Naam
...

Heb dit even nagemaakt:
CODE - CreateTable
  1. CREATE TABLE event
  2. (
  3.     id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
  4.     naam VARCHAR(35) NOT NULL,
  5.     CONSTRAINT eventid PRIMARY KEY (id)
  6. )
  7.  
  8. CREATE TABLE persoon
  9. (
  10.         id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
  11.     naam VARCHAR(35) NOT NULL,
  12.     CONSTRAINT persoonid PRIMARY KEY (id)
  13. )
  14.  
  15.  
  16. CREATE TABLE inschrijving
  17. (
  18.         id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
  19.     persoonid INTEGER NOT NULL,
  20.         eventid INTEGER NOT NULL,
  21.     CONSTRAINT inschrijvingid PRIMARY KEY (id)
  22. )


Ik heb dus 3 tabellen die ik vul met volgende gegevens:
CODE - tblpersoon
  1. ID      NAAM
  2. 1       Jan
  3. 2       Piet
  4. 3       Nina
  5. 4       Samantha

CODE - tblevent
  1. ID      NAAM
  2. 1       Mijn Event
  3. 2       Mijn ander event

CODE - tblinschrijving
  1. ID      PERSOONID     EVENTID
  2. 1       1            1
  3. 2       1            2
  4. 3       2            1
  5. 4       3            1

Waar dus persoon met ID 1 (Jan) ingeschreven is op beide events, Piet en Nina enkel op event 1 (Mijn event)

Mijn SQL om te zien welke persoon waarin is ingeschreven is volgende:
CODE
  1. SELECT PERSOON.NAAM AS PERSOONNAAM, INSCHRIJVINGEN.EVENTNAAM
  2. FROM PERSOON INNER JOIN (
  3.     SELECT EVENT.NAAM AS EVENTNAAM, INSCHRIJVING.PERSOONID
  4.     FROM EVENT INNER JOIN INSCHRIJVING ON (EVENT.ID = INSCHRIJVING.EVENTID)
  5. ) AS INSCHRIJVINGEN ON (PERSOON.ID = INSCHRIJVINGEN.PERSOONID)

Geeft als resultaat:
CODE
  1. PERSOONNAAM     EVENTNAAM
  2. Jan          Mijn Event
  3. Jan          Mijn ander event
  4. Piet        Mijn Event
  5. Nina        Mijn Event
Deze tekst werd het laatst bewerkt voor 2.49 % door SMG op woensdag 28 november 2012 om 22:13:38.
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen