Door
peter paul
op 16-03-2015 16:15
gewijzigd op 16-03-2015 16:17
1.774 views
Hallo, ik heb een vraag met betrekking tot joins. Ik verwijs van uit "test2" meerdere keren naar "test1". Op welke wijze moet ik dan mijn query in elkaar zetten.
Dit is wat ik tot nu toe heb, het werkt perfect maar ik vraag me af of dit niet makkelijker kan. Nu zijn het nog maar 3 verwijzingen maar in mijn project zullen het er minstens 30 worden.
$resultaat2 = mysqli_query($connect, "SELECT a.id, a.VB1, b.naam AS naam1, a.VB2, c.naam AS naam2, a.VB3, d.naam AS naam3
FROM test2 AS a
INNER JOIN test1 AS b
ON a.VB1 = b.id
INNER JOIN test1 AS c
ON a.VB1 = c.id
INNER JOIN test1 AS d
ON a.VB1 = d.id
");
Maar ik zou in elk geval proberen om aliasen te gebruiken die duidelijk zijn.
a, b en c zijn dat niet.
En ook niet te veel afkorten. Mogelijk dat de afkortingen je nu duidelijk zijn, maar ik werk al een jaar of 8 aan een project mee, waar me sommige afkortingen in php of in kolomnamen me nu nog altijd niet duidelijk zijn. idocid lid, pid etc.
SELECT ...
FROM tabelnaam berichten
JOIN test1 verzender ON verzender.id = berichten.VB1
JOIN test2 ontvanger ON ontvanger.id = berichten.VB2
Dit is wat ik tot nu toe heb, het werkt perfect maar ik vraag me af of dit niet makkelijker kan. Nu zijn het nog maar 3 verwijzingen maar in mijn project zullen het er minstens 30 worden.
En ga je dan 27 kolommen bijmetselen? Waarom maak je niet gewoon een koppeltabel?
Ik zal de aliassen zeker aanpassen. Maar er is dus geen andere mogelijkheid dan elke keer dat ik verwijs naar "test1"zal ik een nieuwe join moeten toevoegen?
<?php
$resultaat2 = mysqli_query($connect, "SELECT test2.id, test2.VB1, VB1.naam AS naam1, test2.VB2, VB2.naam AS naam2, test2.VB3, VB3.naam AS naam3
FROM test2
JOIN test1 AS VB1 ON test2.VB1 = VB1.id
JOIN test1 AS VB2 ON test2.VB1 = VB2.id
JOIN test1 AS VB3 ON test2.VB1 = VB3.id
");
Wat je in wezen doet met een koppeltabel is een relatie in een apart record stoppen, in plaats van in een aparte kolom. Voor het toevoegen van een record hoef je geen structurele wijziging door te voeren in je database, voor het echt toevoegen van een kolom wel...
Omdat je tabellen nogal abstracte namen hebben weet ik niet precies wat dit concreet moet voorstellen?
Ook heeft test2.id (met id 1) twee keer een verwijzing naar test1.id (met id 1). Dat kan dus ook voorkomen? Is de volgorde nog op een of andere manier relevant? Die extra informatie kun je dan ook opnemen in je koppeltabel.
Maak je ook gebruik van een relationeel databasetype voor je tabellen (InnoDB)?
je zou het als bijvoorbeeld leerlingen en de lessen die zij volgen kunnen zien. leerlingen hebben een bepaald id, en volgen in dit voorbeeld drie lessen, dat zijn de verwijzingen in "leerlingen" naar "lessen". uiteraard bevat lessen meer informatie dan alleen de naam van het vak.
<?php
lessen
+--+--------+------+
|id| naam|leraar|
+--+--------+------+
| 1| frans| piet|
| 2| gym| kees|
| 3| engels| klaas|
| 4|wiskunde| anna|
+--+--------+------+
Om deze analogie te volgen: je koppeltabel zou dan een lesroosters-tabel kunnen zijn, denk ik.
Hierbij heb je in deze tabel een extra kolom genaamd tijdvak (die je weer naar een tijdvakken-tabel kunt laten verwijzen), als de volgorde van belang is.
(EDIT: oftewel: leerling X volgt in tijdvak Y vak Z)
Meestal niet. Ook in dit geval niet, mede omdat de topicstarter zelf aangeeft dat het er op den duur makkelijk 30+ kunnen worden (het aantal flexibel is / niet op voorhand vast lijkt te staan).