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.

<?php

include ('connect.php');
/*
test1
+--+----+
|id|naam|
+--+----+
| 1|bla1|
| 2|bla2|
| 3|bla3|
+--+----+

test2
+--+---+---+---+
|id|VB1|VB2|VB3|
+--+---+---+---+
| 1| 2 | 1 | 1 |
| 2| 3 | 3 | 1 |
| 3| 3 | 1 | 2 |
+--+---+---+---+

Joined
+--+---+-----+---+-----+---+-----+
|id|VB1|naam1|VB1|naam2|VB1|naam3|
+--+---+-----+---+-----+---+-----+
| 1| 2 | bla2| 1 | bla1| 1 | bla1|
| 2| 3 | bla3| 3 | bla3| 1 | bla1|
| 3| 3 | bla3| 1 | bla1| 2 | bla2|
+--+---+-----+---+-----+---+-----+
*/

$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
");

while ($record2 = mysqli_fetch_array($resultaat2))
{
echo $record2['id'] . " - " . $record2['VB1'] . " - " . $record2['naam1'] . " - " . $record2['VB2'] . " - " . $record2['naam2'] . " - " . $record2['VB3'] . " - " . $record2['naam3'] . "<br>";
}

?>
op zich kan dat zo.

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

etc

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
");

while ($record2 = mysqli_fetch_array($resultaat2))
{
echo $record2['id'] . " - " . $record2['VB1'] . " - " . $record2['naam1'] . " - " . $record2['VB2'] . " - " . $record2['naam2'] . " - " . $record2['VB3'] . " - " . $record2['naam3'] . "<br>";
}
?>

EDIT Ik heb nog niet eerder gehoord van een koppeltabel ik ga maar eens googele.
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)?
Ik zal het wat minder abstract proberen te maken.

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|
+--+--------+------+

Leerlingen
+--+----+----+----+
|id|les1|les2|les3|
+--+----+----+----+
| 1| 2 | 1 | 4 |
| 2| 3 | 4 | 1 |
| 3| 3 | 1 | 2 |
+--+----+----+----+

Joined
+--+----+------+----+--------+----+--------+
|id|les1| naam1|les2| naam2|les2| naam3|
+--+----+------+----+--------+----+--------+
| 1| 2 | gym| 1 | frans| 4 |wiskunde|
| 2| 3 |engels| 4 |wiskunde| 1 | frans|
| 3| 3 |engels| 1 | frans| 2 | gym|
+--+----+------+----+--------+----+--------+
?>
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)

Begin je de oplossing een beetje te zien?
Het lijkt nergens op :-)

lessen is goed.

Leerlingen wordt zoiets:
- id
- naam
- geb. datum
- email
(etc)

dan de jointabel:
In een beetje database zit meer dan 1 jointabel dus een naam als joined snijd geen hout.
Meestal wordt het zo gedaan:

leerlingen_lessen
- leerling_id
- les_id

er hoeft geen primary key in een koppeltabel.

stel dat leerling 1 les 1 en les 2 volgt
stel dat leerling 2 les 2 en les 3 volgt

--------------------
leerling_id | les_id
--------------------
     1      |   1
     1      |   2
     2      |   2
     2      |   3




[size=xsmall]Toevoeging op 16/03/2015 18:30:27:[/size]

Gouden regel is: nooit meerdere kolommen maken in de trant van les1, les2, les3 etc. In dat geval moet je naar een nieuwe tabel.
Frank Nietbelangrijk op 16/03/2015 18:28:36
Het lijkt nergens op :-)

Wat lijkt nergens op?
Thomas van den Heuvel op 16/03/2015 19:37:27

Wat lijkt nergens op?


meerdere kolommen maken in de trant van les1, les2, les3
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).

Reageren