MySQL Joins
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?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>";
}
?>
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>";
}
?>
Gewijzigd op 16/03/2015 16:17:27 door Peter paul
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
Quote:
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?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>";
}
?>
$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.
Gewijzigd op 16/03/2015 16:36:16 door peter paul
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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|
+--+----+------+----+--------+----+--------+
?>
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|
+--+----+------+----+--------+----+--------+
?>
Gewijzigd op 16/03/2015 16:57:50 door peter paul
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?
Gewijzigd op 16/03/2015 17:41:35 door Thomas van den Heuvel
lessen is goed.
Leerlingen wordt zoiets:
- id
- naam
- geb. datum
(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
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
--------------------
leerling_id | les_id
--------------------
1 | 1
1 | 2
2 | 2
2 | 3
leerling_id | les_id
--------------------
1 | 1
1 | 2
2 | 2
2 | 3
Toevoeging op 16/03/2015 18:30:27:
Gouden regel is: nooit meerdere kolommen maken in de trant van les1, les2, les3 etc. In dat geval moet je naar een nieuwe tabel.
Gewijzigd op 17/03/2015 09:59:37 door Frank Nietbelangrijk
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).
Ja klopt. Als het aantal kolommen echt de eerste 10 eeuwen vast staat en het aantal niet te groot is dan kun je ze als kolommen naast elkaar opnemen. Een recent voorbeeld van een ander topic is een schaaktoernooi waarbij er altijd twee spelers tegelijk spelen. schaken doe je alleen met twee spelers en dat zal ook altijd zo blijven (lijkt me) dus dan kun je een kolom speler1 en een kolom speler2 maken.