probleem met queries bij koppeltabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Jo Immanuel

Jo Immanuel

04/07/2013 20:13:21
Quote Anchor link
Beste mensen,

Ik ben bezig met het maken van een site met bijbehorende database. Nu heb ik wat onderzoek gedaan, en ik lees overal over indexeren, databasenormalisatie etc.

Allemaal leuk en aardig natuurlijk die databasenormalisatie en introductie van koppeltabellen, maar ik snap weinig van de mysql queries die je dan moet maken bij bijvoorbeeld koppeltabellen.

Neem nu een simpel voorbeeldje als voetbal. Stel je maakt een tabel Voetbalclub met unique id, naam voetbalclub etc. en je maakt een tabel Voetbalstadion met unique id, stadionnaam etc. Wil je die twee tabellen aan elkaar koppelen maak je dus een koppeltabel waar de unigue id's van tabel voetbalstadion en voetbalclub aan elkaar gekoppeld worden.

Voorbeeld:

tabel Voetbalclub
1. Ajax
2. Feyenoord

tabel Voetbalstadion
1. Arena
2. Kuip

koppeltabel Voetbalclub_Voetbalstadion
1 1
2 2

De koppeltabel bepaalt dat Ajax in de Arena speelt en Feyenoord in de Kuip. Niet zo heel moeilijk natuurlijk.

Maar als je dan met een mysql query de volgende vraag aan de db gaat stellen: In welk stadion speelt Ajax?
Dan kom ik er niet meer uit. Sterker nog: ik ben nu al een dagje op internet aan het zoeken. Ik heb zelfs boeken geraadpleegd over sql/php, maar nergens kan ik vinden waar dit wordt uitgelegd. Nogal vreemd naar mijn smaak, omdat je overal leest over het belang van koppeltabellen en hoe je die moet inrichten, maar vrij weinig vindt over de bijbehorende queries. Ik heb wel een aantal queries gevonden (met JOINT), maar dat waren hele lange rare queries en ze werden ook niet uitgelegd. Voor mijn gevoel moet het allemaal veel simpeler zijn.

Mijn vraag: hoe bepaal je via een sql-query bij bovenstaand voorbeeld in welk stadion Ajax speelt?

Ik zou het heel fijn vinden als iemand mij dat kon vertellen, en ook een beetje kon uitleggen hoe zon 'koppeltabel'-query (mag ik dat zo noemen?) wordt opgebouwd, zodat ik hem ook begrijp en niet een trucje aan het nadoen ben.

Met vriendelijke groet,

Jo
 
PHP hulp

PHP hulp

29/04/2024 18:46:23
 
Erwin H

Erwin H

04/07/2013 22:16:15
Quote Anchor link
Je koppeltabel moet twee keys met elkaar koppelen. In jouw voorbeeld dus club met stadion. Het voorbeeld dat je geeft heeft alleen een paar getallen, maar je moet dus nog wel de kolommen benoemen. Dit zou het moeten zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
CREATE TABLE Voetbalclub_Voetbalstadion(
  club_id INT UNSIGNED,
  stadion_id INT UNSIGNED
)

Nu weet je dus dat een club id direct gekoppeld is aan een stadion id. Je weet ook dat elk club id uniek is en dat elk stadion id uniek is. Wil je dus weten waar club x speelt dat heb je deze query nodig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT club_naam, stadion_naam
FROM clubs
LEFT JOIN Voetbalclub_Voetbalstadion ON clubs.club_id = Voetbalclub_Voetbalstadion.club_id
LEFT JOIN stadions ON Voetbalclub_Voetbalstadion.stadion_id = stadions.stadion_id
WHERE club_naam = 'FC Lutjebroek'

Als je koppeltabellen gebruikt zal je dus altijd eerst de koppeltabel moeten joinen en daarna de gekoppelde tabel (hopelijk begrijp je wat ik daarmee bedoel.

Merk overigens op dat je hier in feite geen koppeltabel nodig hebt. Je hebt namelijk meerdere relaties in relationele databases:
- one to one
- one to many
- many to many
Alleen bij many to many heb je een koppeltabel nodig. In de andere gevallen kan je het oplossen direct in de tabellen zelf. Een voetbalclub speelt normaal gesproken zijn thuiswedstrijden in 1 stadion. Daarmee heb je dus een 1-op-1 relatie (elke club heeft 1 stadion), of een 1-op-veel relatie (elke club heeft 1 stadion, maar een stadion heeft meerdere clubs). In beide gevallen volstaat het om het stadion_id op te nemen in de club tabel.
 
Jo Immanuel

Jo Immanuel

04/07/2013 22:58:15
Quote Anchor link
Hallo Erwin,

Hartstikke bedankt voor je antwoord.

Als ik je voorbeeldquery toepas krijg ik geen errors alleen helaas ook 0 resultaten. Ik zou toch twee dingen moeten zien.


Verder alvast even voor mijn begrip:

Met de 1e regel zeg je wat hij moet zoeken/welke resultaten moet geven (namelijk velden uit de kolom naam club en de kolom naam stadion) en met de 5e regel verfijn je die zoekopdracht (,anders zou je immers alle stadions en clubs krijgen). Niet?

Met de derde en vierde regel maak je de joint tussen de tabellen. Toch? Maar wat ik bijvoorbeeld niet begrijp is dat je zegt in regel twee 'FROM clubs'. Alleen zit Stadion_naam niet in tabel clubs. Die zit in tabel stadions.

Ook begrijp ik niet goed waarom je twee maal een left joint hebt. Als je links de tabel clubs hebt en rechts de tabel stadions en daartussenin de koppeltabel die die twee met elkaar verbindt, dan zou ik een left joint verwachten waar tabel clubs (en club_id) wordt gekoppeld met koppeltabel voetbalclub_voetbalstadion (en club_id) en een right joint (of bestaat dat niet) waar tabel stadions (en stadion_id) wordt gekoppeld met koppeltabel voetbalclub_voetbalstadion (en stadion_id).

groet en dank,

Jo

PS: Stadions en clubs was misschien ook een beetje een ongelukkig gekozen voorbeeld. Je hebt helemaal gelijk dat een club in een vast stadion speelt en dus stadions gewoon als foreign key in de tabel clubs zou kunnen worden opgenomen (zeg ik dat goed?). Maar het is ook maar een voorbeeld om te weten hoe ik sql-queries moet gebruiken wanneer er koppeltabellen zijn.
Gewijzigd op 04/07/2013 23:10:40 door Jo Immanuel
 
Erwin H

Erwin H

04/07/2013 23:41:28
Quote Anchor link
LEFT JOIN en RIGHT JOIN bestaan allebij. Het verschil is welke tabel als uitgangspunt wordt genomen.

Stel je hebt twee tabellen: clubs en stadions.
In clubs heb ik ajax en feyenoord en in stadions heb ik alleen arena staan (du niet de kuip). Ajax is via een stadion_id veld gekoppeld aan arena, feyenoord is gekoppeld aan geen stadion (het stadion_id veld is leeg).
Maak ik de join nu vanuit clubs, met een LEFT JOIN, dan worden de clubs als uitgangspunt genomen. Ik krijg dus twee rijen terug:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
club_naam  |  stadion_naam
-----------+---------------
ajax       | arena
feyenoord  | null

Feyenoord heeft geen stadion en krijgt dus null voor het stadion. Gebruik ik nu een RIGHT JOIN, dan wordt de rechter kolom (= stadion tabel) als uitgangspunt genomen. Dan krijg ik dit terug:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
club_naam  |  stadion_naam
-----------+---------------
ajax       | arena

In de stadion tabel bestaat er maar 1 stadion (arena) en dus krijg ik dat stadion terug, plus de clubs die er aan gekoppeld zijn.

In mijn eerdere voorbeeld heb ik dus LEFT JOINs gebruikt, omdat ik uitging van de clubs en niet van de stadions. Overigens is dit dus ook identiek aan elkaar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT club_naam, stadion_naam
FROM clubs
LEFT JOIN stadions ON clubs.stadion_id = stadions.stadion_id

SELECT club_naam, stadion_naam
FROM stadions
RIGHT JOIN clubs ON stadions.stadion_id = clubs.stadion_id

In beide gevallen worden de records in de clubs tabel als uitgangspunt genomen.

Toevoeging op 04/07/2013 23:46:45:

De kolommen die je selecteert in de SELECT clause kunnen uit alle tabellen komen die je in de FROM selecteert, daarbij horen ook de tabellen die je joint. Dus als ik heb
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
FROM clubs
LEFT JOIN stadions ON clubs.stadion_id = stadions.stadion_id

Dan kan ik alle kolommen selecteren die in de tabel clubs zitten, alsook de kolommen die in de tabel stadions zitten. Mocht je dubbele kolommen hebben (bijvoorbeeld beide hebben een kolom 'id') dan moet je de kolommen prefixen met de tabelnaam (of alias) zodat de database engine weet welke kolom je wilt hebben.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT clubs.id, club_naam, stadion_naam
FROM clubs
LEFT JOIN stadions ON clubs.stadion_id = stadions.stadion_id
Gewijzigd op 04/07/2013 23:51:10 door Erwin H
 
Frank Nietbelangrijk

Frank Nietbelangrijk

05/07/2013 01:59:32
Quote Anchor link
Jo,
mag ik u er op wijzen dat een join heel iets anders is dan een joinT?
 
Ozzie PHP

Ozzie PHP

05/07/2013 02:16:44
Quote Anchor link
@Frank: hahaha +1, volgens mij heeft de topicstarter er een teveel op..

Afbeelding
 
Jo Immanuel

Jo Immanuel

05/07/2013 02:53:04
Quote Anchor link
He Erwin,

Allereerst: bedankt voor je uitleg en tijd. Ik weet nu dat bij een join (sorry, ik ben nieuw in de wereld die programmeren heet) je alle betrokken tabellen en kolommen die daarin zitten kan gebruiken.

Misschien een hele domme vraag, maar wie bepaalt wat links en rechts is?
Als ik in jouw voorbeeld:

SELECT club_naam, stadion_naam
FROM clubs
LEFT JOIN stadions ON clubs.stadion_id = stadions.stadion_id

'LEFT' vervang door 'RIGHT', en bij:

SELECT club_naam, stadion_naam
FROM stadions
RIGHT JOIN clubs ON stadions.stadion_id = clubs.stadion_id

'RIGHT' vervang door 'LEFT', dan heb je toch hetzelfde? Kortom: ik begrijp het verschil tussen left en right join nog niet helemaal denk ik. Is het niet gewoon de regel 'FROM stadions' of 'FROM clubs' die bepaalt welke tabel (stadions of clubs) als uitgangspunt wordt genomen en het vervolg van de query bepaalt? Misschien denk ik ook gewoon te moeilijk.

Verder even voor mijn begrip: bovenstaand voorbeeld van je is niet met een koppeltabel? Toch? Want ik zie geen koppeltabellen meer terugkomen. En zodra je gebruik maakt van koppeltabellen dat moet je 2x joinen. Eerst JOIN je de koppeltabel aan de tabel die je als uitgangspunt neemt (door de id die in beide tabbellen voorkomt aan elkaar gelijk te stellen). En daarna JOIN je de derde tabel aan de koppeltabel (door de id die in beide tabbellen voorkomt aan elkaar gelijk te stellen).
Of doe je dat laatste alleen als je links JOINT.


Punt blijft overigens wel dat mijn query nog niet naar behoren werkt.

Als ik mijn query uitvoer als volgt:

SELECT clubnaam, stadionnaam
FROM tbl_clubs
LEFT JOIN ktbl_club_stadion ON tbl_clubs.clubID = ktbl_club_stadion.clubID
LEFT JOIN tbl_stadions ON ktbl_club_stadion.stadionID = tbl_stadions.stadionID
WHERE clubnaam = 'Ajax'

dan krijg ik geen foutmelding (is al heel wat bij mij) maar 0 resultaten (MySQL gaf een lege resultatenset terug (0 rijen). ( query duurde 0.0004 sec )). Dit terwijl tbl_clubs gevuld is, tbl_stadions gevuld is (mooie woordspeling) en de ktbl_club_stadion gevuld is. Ik zou de volgende rij verwachten te zien: "Ajax, Amsterdam Arena". Dus daar gaat iets niet helemaal goed. Waar zou dat aan kunnen liggen?

Instellingen misschien?

tbl_clubs:
clubID (int(10), UNSIGNED, AUTO-INCREMENT)
clubnaam (varchar(45), utf8_general_ci)

tbl_stadions:
stadionID (int(10), UNSIGNED, AUTO_INCREMENT)
stadionnaam (varchar(45), utf8_general_ci)

ktbl_club_stadion:
club_stadionID (int(10), UNSIGNED, AUTO_INCREMENT)
clubID (int(10), UNSIGNED)
stadionID (int(10), UNSIGNED)

Verder heb ik bij relatieoverzicht (bij ktbl_club_stadion) de volgende dingen (relaties) ingesteld:
Bij clubID bij het veld "Beperking voor vreemde sleutel (INNODB)" gekozen voor 'voorbeeld'.''tbl_clubs'.'clubID'.
En bij stadionID voor 'voorbeeld'.''tbl_stadions'.'stadionID'.
Verder staat "Kies weer te geven veld" op "clubID".
Bij relaties in het relatieoverzicht van tbl_clubs & tbl_stadionds zijn er geen velden gevuld.

Overigens zie ik ook de volgende melding:

U gebruikt de verlopen 'mysql' uitbreiding, die niet in staat is om met meerdere queries om te gaan. <b>De uitvoering van sommige opgeslagen routines kan falen!</b> Gelieve de verbeterde 'mysqli' uitbreiding te gebruiken om problemen te vermijden. (oh oh, ik zie weer een nieuw probleem aankomen)


Wat zou de reden kunnen zijn dat ik geen resultaten met de query krijg?

PS: sorry voor de enorme lap tekst. Maar ik heb dringend behoefte aan een succesjes met mysql en testservers.
Gewijzigd op 05/07/2013 03:28:59 door Jo Immanuel
 
Erwin H

Erwin H

05/07/2013 09:32:38
Quote Anchor link
LEFT en RIGHT zijn gedefinieerd. De 'linker' tabel is de tabel die al geselecteerd is (dus in de FROM clause, plus eventueel alles wat er via joins al aan toegevoegd is), de 'rechter' tabel is de tabel die je er aan wil joinen. Gebruik je dus een LEFT JOIN dan is de tabel in de FROM clause het uitgangspunt, gebruik je een RIGHT JOIN dan is de tabel die je wilt toevoegen het uitgangspunt. LEFT en RIGHT simpel vervangen zal je dus NIET zomaar hetzelfde resultaat opleveren.

Als je query geen resultaten geeft dan moet je naar de onderliggende data kijken. Ik weet niet wat je precies in je tabellen hebt aan records, dus ik kan er zo geen zinnig woord over zeggen.

De mysql_xxxx functies gaan verdwijnen uit php. Het is dus verstandig om een andere database extensie te gebruiken, bijvoorbeeld de mysqli_xxxx functies. Deze werken vrijwel hetzelfde als de mysql_xxxx functies, maar check de php manual voor de verschillen: http://nl1.php.net/manual/en/book.mysqli.php
 
Jo Immanuel

Jo Immanuel

05/07/2013 12:14:30
Quote Anchor link
Goedemorgen Erwin,

Ik begin het denk ik te begrijpen. Voor het uitgangspunttabel (en de gevolgen daarvan voor je resultaten) was je voorbeeld met 2 tabellen heel verhelderend. Alleen heeft datzelfde voorbeeld voor wat betreft left en right join denk ik wat verwarring bij me veroorzaakt.

Over het niet krijgen van resultaten, of beter gezegd het krijgen van 0 resultaten (want dat is natuurlijk ook een resultaat). De vulling van de verschillende tabellen is als volgt:

tbl_clubs
clubID, clubnaam
1, Ajax
2, PSV
3, Feyenoord
etc.

tbl_stadions
stadionID, stadionnaam
1, Amstadam Arena
2, Philipsstadion
3, de Kuip
etc.

ktbl_club_stadion
club_stadionID, clubID, stadionID
1, 1, 1
2, 2, 2
3, 3, 3
etc.

Dan zou ik toch met de query die jij gaf in je eerste bericht als resultaat de volgende rij moeten hebben: "Ajax, Amsterdam Arena"?

Ik begrijp dus niet waar dat aan kan liggen. Ik vermoed zelf dat het iets te maken zou kunnen hebben met de relatie-instellingen in mijn tabel. Ik heb bij de koppeltabel (ktbl_club_stadoin) relaties ingesteld (zie mijn vorige bericht). Moet dit juist niet? of is dit niet goed gevuld? Of moet ik juist ook nog bij de andere 2 tabellen (tbl_clubs en tbl_stadions) bij relatieoverzicht relaties instellen? Want die zijn op dit moment niet gevuld.

Zoiezo lijkt het vullen van het relatieoverzicht mij een beetje dubbelop als je ook in de join de relatie beschrijft. Als je dat laatste doet, waarom zou je dan nog in het relatieoverzicht die dingen instellen?


PS: zoals je waarschijnlijk al wel gemerkt hebt, ben ik helemaal nieuw met databases en mysql en het heeft me aardig wat tijd en energie gekost om een testserver en database op te zetten waar ik tabellen in kon aanmaken en vullen en waar het me lukte om met simpele sql queries resultaten op te halen. Dus ik ben wat huiverig om daar veranderingen in aan te brengen. Of is het een peace of cake om over te stappen van mysql op mysqli?

In ieder geval enorm bedankt voor je geduld en ik hoop dat je (of iemand anders) me nog zo kunnen helpen wat betref het krijgen van 0 resultaten.

Groet,

Jo
Gewijzigd op 05/07/2013 12:30:34 door Jo Immanuel
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/07/2013 12:48:10
Quote Anchor link
Foreign Keys behoren tot de DDL (Data Definition Language) en Query's tot de DML (Data Manipulation Language).
Ze zullen in ieder geval nooit effect hebben op het resultaat van een select query.

Maar kijk eens wat er gebeurt als je de WHERE weglaat, krijg je dan wel resultaat?
 
Jo Immanuel

Jo Immanuel

05/07/2013 13:10:43
Quote Anchor link
Aha, kijk. Ik heb het gevonden. Heel dom van mezelf al zeg ik het zelf. In mijn tabel tbl_clubs staat bij clubnaam 'AFC Ajax'. Als je dan bij WHERE clubnaam 'Ajax' intypt, dan krijg je natuurlijk 0 resultaten, want 'Ajax' staat niet in de tabel clubs.

Hartstikke bedankt Erwin voor je hulp, geduld en uitleg. En jij ook Ger. Jouw opmerking over het weglaten van de WHERE deed het kwartje doen vallen bij me en heeft me mijn ietwat stompzinnige fout doen ontdekken. Nogmaals: hatstikke bedankt. Dit had ik echt even nodig.


Wel heb ik nog een aantal laatste vragen, al ga ik dan misscchien wel wat offtopic:

1. @Ger. Wat bedoel je met je opmerking over datamamipulatie? Zijn mijn instellingen verkeerd? Ik kan die opmerking niet zo goed plaatsen.

2. Is het voor mij aan te raden om mysqli te installeren? En zo ja, is dit makkelijk of zal ik daarna alles weer in moeten stellen wat betrefr servers, db's etc.?

3. De instellingen in het relatieoverzicht in het geval van koppeltabellen (maar ook wanneer je hier geen gebruik van maakt) zijn me nog niet helemaal duidelijk. Ik heb deze instellingen ergens van internet overgenomen, maar weet eigenlijk niet waarom het zo ingesteld moet worden. Ik heb dus in het relatieoverzicht van de koppeltabel de twee pk's (in deze tabel zijnde fk's) gekoppeld aan de desbetreffende pk uit de andere tabel. En dit niet voor 'interne sleutel' (wanneer gebruik je die dan?), maar voor 'beperking van vreemde sleutel INNODB'. En bij het relatieoverzicht van de andere twee tabellen (niet zijnde koppeltabellen) heb ik niets gevuld.
Kan iemand mij daar iets meer over vertellen?

Groet,

Jo
Gewijzigd op 05/07/2013 13:26:52 door Jo Immanuel
 
Erwin H

Erwin H

05/07/2013 13:22:43
Quote Anchor link
Nog even over de mysql_xxxx extensie versus de mysqli_xxxx extensie. Dat heeft nul effect op je onderliggende database. Deze extensies zijn puur php code die ervoor zorgt dat je een connectie met je database kan maken en er queries op los kunt laten. De database zoals je die hebt blijft dus gewoon precies hetzelfde.
 
Jo Immanuel

Jo Immanuel

05/07/2013 13:27:55
Quote Anchor link
Hallo Erwin,

Is het gewoon een simpele handeling van donwloaden uitpakken, uitvoeren en gebruiken?

groet,

Jo
Gewijzigd op 05/07/2013 13:29:30 door Jo Immanuel
 
Erwin H

Erwin H

05/07/2013 13:30:59
Quote Anchor link
Over het algemeen is het al geinstalleerd, dus je hoeft zelf helemaal niets te doen, behalve dan de juiste functies aanroepen.
 
Jo Immanuel

Jo Immanuel

05/07/2013 13:43:04
Quote Anchor link
Erwin H op 05/07/2013 13:30:59:
Over het algemeen is het al geinstalleerd, dus je hoeft zelf helemaal niets te doen, behalve dan de juiste functies aanroepen.


OK. Hoe het is dus al geinstalleerd, ik hoef daar geen instelling voor aan te passen en het is gewoon een kwestie van de juiste functies aanroepen. Maar hoe zorg ik ervoor dat ik de juiste functies van mysqli gebruik/aanroep? En waar roep ik nu oude mysql functies aan?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/07/2013 14:40:05
Quote Anchor link
Even terugkomend op je eerdere vragen.

Met DDL statements bepaal je de structuur van de database en met DML statements bepaal je de inhoud van de database, dus:
DDL = CREATE, ALTER, DROP etc.
DML = SELECT, INSERT, UPDATE en DELETE

Als jij met jouw tool (PHPMyAdmin vermoed ik) tabellen aan maakt wordt er door die tool een CREATE TABLE query uitgevoerd.

Foreign keys (alle keys trouwens) zijn onderdeel van de database structuur, en je bereikt er mee dat er geen 'rare' dingen kunnen gebeuren in je database.
Bijvoorbeeld de FK stadion_id in de koppeltabel refereert aan PK stadion_id in de stadions tabel.
Als je nu een stadion_id wat niet in de tabel stadions voorkomt probeert te inserten, krijg je een SQL foutmelding om je horen.

Dan kan je optioneel ook nog opgeven wat er moet gebeuren als er een UPDATE of DELETE plaats vindt in de referentie tabel, met ON DELETE RESTRICT kan bv een stadion niet uit de tabel stadions worden verwijderd als dat id nog in de koppeltabel staat.
Van de andere kant kan je met ON DELETE CASCADE voor de club_id regelen dat als een club verwijderd wordt tegelijkertijd ook de koppeling met het stadion uit de koppeltabel verdwijnt.
 
Erwin H

Erwin H

05/07/2013 14:47:09
Quote Anchor link
Jo Immanuel op 05/07/2013 13:43:04:
En waar roep ik nu oude mysql functies aan?

Geen idee, want ik zie geen php code van je. Maar ik gok dat je de volgende functies (en mogelijk nog meer) gebruikt voor de connectie met je database en het uitvoeren van je query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script

Dit zijn de functies die in een php library zitten die gaat verdwijnen. Gezien de melding die je eerder gaf maak je hier gebruik van.
In de nabije toekomst gaan al deze functies verdwijnen en moet je die dus vervangen, bijvoorbeeld door de mysqli functies http://nl3.php.net/manual/en/book.mysqli.php
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/07/2013 15:02:33
Quote Anchor link
Quote:
U gebruikt de verlopen 'mysql' uitbreiding, die niet in staat is om met meerdere queries om te gaan. De uitvoering van sommige opgeslagen routines kan falen! Gelieve de verbeterde 'mysqli' uitbreiding te gebruiken om problemen te vermijden. (oh oh, ik zie weer een nieuw probleem aankomen)

Ik geloof niet dat dat PHp met een Nederlandse melding komt ;-)
Dus ik denk dat de mysqli extensie niet mee geinstalleerd is tijdens de instalattie
 
Jo Immanuel

Jo Immanuel

05/07/2013 15:09:50
Quote Anchor link
He Ger,

Je hebt het nu over de instellingen in het relatieoverzicht van de tabellen toch?
En als ik het goed begrepen heb, moet je die invullen om geen rare dingen te krijgen in je database. Zodat je in de koppeltabel geen records kan invoeren die niet overeenkomen met de records uit andere tabellen. Dit moet dus ingesteld zijn bij mij, want ik wil natuurlijk wel alleen maar gegevens in mijn koppeltabellen hebben die ergens op slaan.

Ik heb nog wel een aantal vragen hierover:

1- staan bij mij de instellingen in de relatieoverzichten van de tabellen dan goed? Ik heb dus alleen bij de koppeltabel bij kolom 'beperking voor vreemde sleutel INNODB' de fk's uit de koppeltabel gekoppeld aan de pk's van de andere twee tabellen. (ik heb overigens de instellingen daarvan veranderd van delete cascade naar delete restricted. Gewoon, als extra beveiligingetje. Kan ik altijd weer terugveranderen). In de andere twee tabellen (die van de pk's) heb ik geen relaties ingevoerd. Is dat goed?

2- Wanneer gebruik je in de koppeltabel bij 'relatieoverzicht - relatie' de optie "interne relatie"? Ik lees zelf bij de rollover over het vraagtekentje dat interne relatie niet nodig is als er al een fk-relatie bestaat. Dit is dus het geval bij mij. Maar wanneer gebruik je die dan wel? Als je geen koppeltabellen gebruikt? En hoe gebruik je dat dan precies?

(PS: waarom leggen ze overigens zulke dingen in boeken nooit uit? Daar geven ze altijd alleen maar aan hoe je het moet instellen (en dan mag je al blij zijn). Waarom je iets doet vergeten ze vaak te vertellen, en dat heb ik juist nodig om dingen te kunnen leren. Maar goed.)


Toevoeging op 05/07/2013 15:17:14:

Ger van Steenderen op 05/07/2013 15:02:33:
Quote:
U gebruikt de verlopen 'mysql' uitbreiding, die niet in staat is om met meerdere queries om te gaan. De uitvoering van sommige opgeslagen routines kan falen! Gelieve de verbeterde 'mysqli' uitbreiding te gebruiken om problemen te vermijden. (oh oh, ik zie weer een nieuw probleem aankomen)

Ik geloof niet dat dat PHp met een Nederlandse melding komt ;-)
Dus ik denk dat de mysqli extensie niet mee geinstalleerd is tijdens de instalattie


Ik gebruik inderdaad MYSQL en wil later met dreamweaver/php de database aan gaan sturen/bevragen. Maar das van latere zorg. Eerst had ik gedacht mn kennis en kunde van databases en (my)sql te vergroten.

Ok, dus er is in mijn geval een mysqli extensie niet mee geinstalleerd. Enig idee hoe ik dat zou kunnen verhelpen? Ik ben namelijk wat bang om te gaan experimenteren hierin, omdat het me aardig wat tijd en energie gekost heeft om de installatie en servers etc voor elkaar te krijgen...

groet,

Jo
Gewijzigd op 05/07/2013 15:10:36 door Jo Immanuel
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/07/2013 15:35:03
Quote Anchor link
Een interne relatie heb je alleen als je een boomstructuur in één tabel zou willen opslaan, en dan met parent-child gaat werken. Even als voorbeeld.

Je gebruikt FK's niet alleen bij koppeltabellen, want die zijn alleen van toepassing bij meer op meer relaties. Als je nu bijvoorbeeld straks een tabel voor de spelers gaat maken krijg je één club, meerdere spelers, maar een speler kan maar bij één club tegelijker tijd voetballen, en dus de relatie club-speler 1 op meer. Dus heb je een kolom club_id in de spelers tabel met een FK naar clubs (club_id).
 
Jo Immanuel

Jo Immanuel

05/07/2013 15:52:54
Quote Anchor link
Ah, OK.

Dus even resumerend: in het geval van spelers en clubs heb je een 1 op meer relatie. Je hebt dan maar twee tabellen nodig met elk hun eigen pk (1 voor club met clubID als pk & 1 voor speler met spelerID als pk). De pk van spelers (spelerID) komt dan als fk in de tabel voor clubs terecht. EN in het relatieoverzicht van de tabel CLUBS leg je in dat geval een INTERNE relatie naar de tabel spelers en pk spelerID. En in het relatieoverzicht van tabel spelers hoef je niets in te stellen.


Toevoeging op 05/07/2013 18:29:37:



Hallo, ben ik weer.


Ik heb nu een nieuw probleem. Ik probeer nu spelers aan een club te koppelen met een koppeltabel.
(ik heb overigens hiervoor gekozen omdat een speler in meer dan 1 team kan zitten en er in 1 team meerdere spelers zitten).

Ik heb precies dezelfde koppeltabel gemaakt (voor wat betreft de instellingen) genaamd ktbl_club_speler.
Alleen zodra ik een twee speler en bijbehorende club wil invoeren in die koppeltabel krijg ik een error:
" MySQL retourneerde: Documentatie #1062 - Duplicate entry '1' for key 'clubID' "

Ik kan dus niet 2x een speler aan ajax koppelen.

Hier had ik in de eerder gemaakte koppeltabel geen last van: immers elke club hoorde bi j1 stadion.

Blijkbaar zit er toch ergens iets in de instellingen van mijn koppeltabel niet goed. Kan iemand mij op weg helpen?

groet,

Jo


OK, ik heb het al gevonden. De indexen van clubID en spelerID waren op status ´unique´. Ik heb hem verandert naar ´index´ en nu kan ik wel meerdere spelers aan ajax koppelen in de kopeltabel (meerder records invoeren met clubID = 1 (AFC Ajax))
Voor de mensen die tegen hetzelfde probleem aanlopen.
Gewijzigd op 05/07/2013 18:37:24 door Jo Immanuel
 

Pagina: 1 2 volgende »



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.