Queries na normaliseren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior, Medior and Junior SAP HANA Developer

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Veldhoven Vacature ID: 12696 Introductie Our client is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. Wat verwachten we van jou? SAP Certified Application Associate - SAP HANA Cloud Modeling (training and/or certification) Bachelor degree or higher Excellent understanding of SAP HANA (2.0 / Cloud), Data Modelling and writing

Bekijk vacature »

Ama saril

ama saril

05/12/2012 13:07:59
Quote Anchor link
Hallo mensen van phphulp.

Ik heb de tutorial gevolgd om een database te normaliseren en dat is wel gelukt denk ik. Ik zit nu alleen met het probleem dat het ophalen van de gegevens echt een stuk lastiger is geworden en na een hele poos zitten te klooien met queries heb ik besloten om hier toch maar de vraag te stellen :

Ik heb gewoon een oefenscenario gemaakt alsvolgt; Een systeem houd bij welke hobbies een persoon heeft. Deze hobbies zijn tevens van een bepaald thema. De database ziet er alsvolgt uit:

tbl_persoon
persoon_id
naam
adres
woonplaats

tbl_persoon_hobbies
persoon_id
hobby_id

tbl_hobbies
hobby_id
hobby_naam
hobby_tijd

tbl_hobbies_type
hobby_id
hobbytype_id

tbl_type
hobbytype_id
hobbytype_naam

Ik wil dan (mbv een invoerscherm die ik later maak) de volgende zoekopdracht uitvoeren:
Ik wil de NAW gegevens van alle personen die een hobby hebben met het type 'outdoor' (dus hobbytype_naam = outdoor).

Ik heb tot nu toe de volgende query al maar ik weet nu niet hoe ik verder moet:

SELECT persoon.naam, persoon.adres, persoon.woonplaats
FROM tbl_persoon AS persoon
INNER JOIN (tbl_hobbies as hobby
INNER JOIN
tbl_persoon_hobbies as ph
on ph.hobby_id = hobby.hobby_id)
ON ph.persoon_id = persoon.persoon_id WHERE persoon.naam = "sjaak"

(WHERE persoon.naam = "sjaak" moet later worden veranderd naar WHERE hobbytype_naam = "eenhobbynaam").

Kan iemand mij hiermee helpen?

Toevoeging op 05/12/2012 14:41:39:

Nog verder gaan zoeken en ik denk dat ik em nu toch heb :)

SELECT persoon.naam, persoon.adres, persoon.woonplaats
FROM tbl_persoon as persoon INNER JOIN tbl_persoon_hobbies ph
ON persoon.persoon_id = ph.persoon_id JOIN tbl_hobbies as h
ON ph.hobby_id = h.hobby_id JOIN tbl_hobbies_type as ht
ON h.hobby_id = ht.hobby_id JOIN tbl_type as type
ON ht.hobby_id = type.hobbytype_id
WHERE type.hobbytype = 'outdoor'
 
PHP hulp

PHP hulp

07/12/2024 01:08:28
 
Erwin H

Erwin H

05/12/2012 14:52:08
Quote Anchor link
op zich ben je goed bezig. Via joins link je de tabellen aan elkaar en zorg je ervoor dat je dus de gegevens aan elkaar knoopt. Doe het gewoon tabel voor tabel en je komt er vanzelf.

Als je bijvoorbeeld de hobbies weer aan de personen wilt hangen knoop je eerst de tabel persoon_bobbies aan de persoon tabel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT a.persoon_id, naam, adres, woonplaats
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id;


Vervolgens knoop je aan de (virtuele) tabel die ontstaat de hobbies tabel

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT a.persoon_id, naam, adres, woonplaats, hobby_naam, hobby_tijd
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id
LEFT JOIN tbl_hobbies c ON b.hobby_id = c.hobby_id;


Merk op dat je niet allerlei haakjes nodig hebt om die joins te scheiden.

Wil je nu alle personen hebben die hobby X hebben dan kan je gewoon het volgende doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT a.persoon_id, naam
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id
LEFT JOIN tbl_hobbies c ON b.hobby_id = c.hobby_id
WHERE hobby_naam = 'X';


En dan een persoonlijke tip. Om alle queries die je daarna maakt om data te selecteren wat simpeler te maken zou ik views definieren. Voor bovenstaande kan je bijvoorbeeld de volgende view maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
CREATE VIEW v_persoon_hobbies AS
SELECT a.persoon_id, naam, adres, woonplaats, hobby_naam, hobby_tijd
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id
LEFT JOIN tbl_hobbies c ON b.hobby_id = c.hobby_id;


Vervolgens kan je select statement dan zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT persoon_id, naam
FROM v_persoon_hobbies
WHERE hobby_naam = 'X';


Een view is niets meer dan een virtuele tabel. Je maakt een view een keer aan op de database en vervolgens kan je elke keer weer gebruiken. Het eerder SELECT statement met de joins werkt dus in feite precies hetzelfde als met bovenstaande view. Het voordeel van een view is dat je niet elke keer weer de joins hoeft te maken. Qua snelheid maakt het niets uit.
 
Ama saril

ama saril

06/12/2012 14:18:47
Quote Anchor link
Erwin H op 05/12/2012 14:52:08:
op zich ben je goed bezig. Via joins link je de tabellen aan elkaar en zorg je ervoor dat je dus de gegevens aan elkaar knoopt. Doe het gewoon tabel voor tabel en je komt er vanzelf.

Als je bijvoorbeeld de hobbies weer aan de personen wilt hangen knoop je eerst de tabel persoon_bobbies aan de persoon tabel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT a.persoon_id, naam, adres, woonplaats
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id;


Vervolgens knoop je aan de (virtuele) tabel die ontstaat de hobbies tabel

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT a.persoon_id, naam, adres, woonplaats, hobby_naam, hobby_tijd
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id
LEFT JOIN tbl_hobbies c ON b.hobby_id = c.hobby_id;


Merk op dat je niet allerlei haakjes nodig hebt om die joins te scheiden.

Wil je nu alle personen hebben die hobby X hebben dan kan je gewoon het volgende doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT a.persoon_id, naam
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id
LEFT JOIN tbl_hobbies c ON b.hobby_id = c.hobby_id
WHERE hobby_naam = 'X';


En dan een persoonlijke tip. Om alle queries die je daarna maakt om data te selecteren wat simpeler te maken zou ik views definieren. Voor bovenstaande kan je bijvoorbeeld de volgende view maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
CREATE VIEW v_persoon_hobbies AS
SELECT a.persoon_id, naam, adres, woonplaats, hobby_naam, hobby_tijd
FROM tbl_persoon a
LEFT JOIN tbl_persoon_hobbies b ON a.persoon_id = b.persoon_id
LEFT JOIN tbl_hobbies c ON b.hobby_id = c.hobby_id;


Vervolgens kan je select statement dan zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT persoon_id, naam
FROM v_persoon_hobbies
WHERE hobby_naam = 'X';


Een view is niets meer dan een virtuele tabel. Je maakt een view een keer aan op de database en vervolgens kan je elke keer weer gebruiken. Het eerder SELECT statement met de joins werkt dus in feite precies hetzelfde als met bovenstaande view. Het voordeel van een view is dat je niet elke keer weer de joins hoeft te maken. Qua snelheid maakt het niets uit.


Ah hartstikke bedankt, van views had ik nog niet gehoord. Maar als ik een view aanmaak en een dag later update ik een tabel, wordt dan ook mijn view 'geupdate' zeg maar?
 
Erwin H

Erwin H

06/12/2012 14:32:08
Quote Anchor link
Nee, net als met queries zal je dat handmatig moeten doen. Als je dus een kolomnaam verandert en de view probeert te gebruiken dan zal MySQL een foutmelding geven omdat die die kolom niet kan vinden. Om de view aan te passen eerst verwijderen en dan weer aanmaken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
DROP VIEW v_persoon_hobbies;
CREATE VIEW v_persoon_hobbies AS
....
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/12/2012 15:37:29
Quote Anchor link
Erwin, ik denk dat je Ama hier mee in verwarring brengt.
Als je de structuur van een tabel aanpast moet je de VIEW een dropje geven, en opnieuw aanmaken.
Indien je de gegevens in de tabel update worden deze gewoon doorgevoerd in de VIEW
 
Erwin H

Erwin H

06/12/2012 15:47:31
Quote Anchor link
Ik las het 'een dag later update ik een tabel' als een structuur update van de tabel, niet als een update van de data in de tabel. Maar je hebt gelijk Ger dat het niet helemaal duidelijk is uit de vraag. Dus jouw verduidelijk is inderdaad wel belangrijk.
 
Ama saril

ama saril

07/12/2012 10:40:58
Quote Anchor link
Bedankt Ger en Erwin.

Misschien was mijn vraagstelling niet helemaal duidelijk (het SQL jargon is nieuw dus misschien dat daardoor verwarring ontstaat).

Als ik in ieder geval nieuwe data in mijn originele tabel toevoeg wordt deze data ook automatisch meegenomen in de view als ik et goed begrijp.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/12/2012 14:33:45
Quote Anchor link
Ja dat begrijp je goed. Een beetje simpel gesteld is een view een opgeslagen subquery.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.