Probleem met JOIN
tabel1:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----+----------+
| id | kleur |
+----+----------+
| 1 | Rood |
| 2 | Geel |
| 3 | Groen |
+----+----------+
| id | kleur |
+----+----------+
| 1 | Rood |
| 2 | Geel |
| 3 | Groen |
+----+----------+
en tabel2:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----+----------+----------+
| id | merk | kleur_id |
+----+----------+----------+
| 1 | Toyota | 1 |
| 2 | Nissan | 2, 3 |
| 3 | Mazda | 1, 3 |
+----+----------+----------+
| id | merk | kleur_id |
+----+----------+----------+
| 1 | Toyota | 1 |
| 2 | Nissan | 2, 3 |
| 3 | Mazda | 1, 3 |
+----+----------+----------+
Nu dienen deze tabellen natuurlijk dmv JOIN opgehaald te worden. Het probleem is dat de auto's meerder kleuren kunnen hebben, anders was het een simpele JOIN als:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
2.merk,
1.kleur,
FROM
tabel1 AS 1
INNER JOIN
kleuren AS 2
ON 2.id = 1.kleur_id
2.merk,
1.kleur,
FROM
tabel1 AS 1
INNER JOIN
kleuren AS 2
ON 2.id = 1.kleur_id
Maar hoe moet ik deze tabellen nu joinen?
Gewijzigd op 01/01/1970 01:00:00 door KrissCross
Jezpur schreef op 17.06.2008 18:12:
Dat werkt niet. De kleur_id moet vervangen worden door de namen van kleuren zelf, en dat gebeurt op deze manier niet. De WHERE werkt ook alleen als een auto maar 1 kleur heeft en de kleur_id dus bestaat uit in cijfer.
@KrissCross: je werkt met een incorrect datamodel, daardoor wordt het onmogelijk om een correcte JOIN uit te voeren. Je kunt nooit meerdere gegevens in 1 veld opslaan zoals jij nu wel doet. Kan een merk meerdere kleuren hebben, dan zul je gebruik moeten maken van een koppeltabel.
Ga normaliseren en zorg allereerst dat je datamodel correct is. Dan pas kun je over de joins gaan nadenken.
Even offtopic, is er een goede uitleg over Joins? Zelf ben ik er niet zo bekend mee, enkel de join manier die Jezpur hierboven gaf. De tutorial hier op PHPhulp snap ik niet zo goed.
Meer tabellen is niet trager of slechter, met dat in het achterhoofd en goede wil moet je een eind kunnen komen.
deze tutorial? Die is toch redelijk duidelijk. Verder heb ik er in de SQL beginnershandleiding, ook een klein stukje over geschreven.
En uiteraard zijn de handleiding van je database en google ook een goede informatie bron voor dit onderwerp...
Je hebt het over En uiteraard zijn de handleiding van je database en google ook een goede informatie bron voor dit onderwerp...
TABEL kleuren
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----------+--------+
| kleur_id | naam |
+----------+--------+
| 1 | Rood |
| 2 | Geel |
| 3 | Groen |
+----------+-------- +
| kleur_id | naam |
+----------+--------+
| 1 | Rood |
| 2 | Geel |
| 3 | Groen |
+----------+-------- +
TABEL APK (Auto's per Kleuren)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+---------+----------+----------+
| APK_id | merk_id | kleur_id |
+---------+----------+----------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
+---------+----------+----------+
| APK_id | merk_id | kleur_id |
+---------+----------+----------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
+---------+----------+----------+
TABEL automerken
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+-----------+----------+
| merk_id | naam |
+-----------+----------+
| 1 | Toyota |
| 2 | Nissan |
| 3 | Mazda |
+-----------+----------+
| merk_id | naam |
+-----------+----------+
| 1 | Toyota |
| 2 | Nissan |
| 3 | Mazda |
+-----------+----------+
Verbeter me als ik het fout doe :)
Allereerst zou ik de tabelnaam APK veranderen in iets zinvollers, bijvoorbeeld 'automerken_kleuren' oid. Op die manier weet je direct aan de naam dat je met een koppeltabel te maken hebt.
Verder is de kolom APK_id in die tabel overbodig. De kolommen merk_id en kleur_id vormen samen de PK in die tabel, daar heb je niets extra's voor nodig.
@ Jan Aart: Bedankt voor de opzet, nu begrijp ik net iets beter wat het idee moet zijn van de koppeltabel.
tabel1:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----+----------+
| id | team |
+----+----------+
| 1 | Toyota |
| 2 | Nissan |
| 3 | Mazda |
+----+----------+
| id | team |
+----+----------+
| 1 | Toyota |
| 2 | Nissan |
| 3 | Mazda |
+----+----------+
tabel2:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----+---------------+
| id | kleur_naam |
+----+---------------+
| 1 | Rood |
| 2 | Geel |
| 3 | Groen |
+----+---------------+
| id | kleur_naam |
+----+---------------+
| 1 | Rood |
| 2 | Geel |
| 3 | Groen |
+----+---------------+
en tenslotte de koppeltabel:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
+----------+----------+
| team_id | kleur_id |
+----------+----------+
| 1 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 3 |
+----------+----------+
| team_id | kleur_id |
+----------+----------+
| 1 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 3 |
+----------+----------+
Nu wil ik dmv JOIN alle teams weergeven met de daarbij behorende kleuren (niet de nummers, maar de namen van de kleuren). Maar ik krijg het niet voor elkaar. Ik geef toe, ik ben geen ster in het JOINEN...
Gewijzigd op 01/01/1970 01:00:00 door KrissCross
hier wat aan?
Misschien heb je Robert_Deiman schreef op 17.07.2008 09:57:
Misschien heb je hier wat aan?
Ja, maar ook daarmee kom ik er niet uit. Ik heb het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$teamkleuren = "SELECT
1.naam,
2.kleur_naam
FROM
tabel1 AS 1
INNER JOIN
(tabel2 AS 2
INNER JOIN
koppeltabel AS kt
ON
kt.kleur_id = 2.id
)
ON
kt.team_id = 1.id
";
?>
$teamkleuren = "SELECT
1.naam,
2.kleur_naam
FROM
tabel1 AS 1
INNER JOIN
(tabel2 AS 2
INNER JOIN
koppeltabel AS kt
ON
kt.kleur_id = 2.id
)
ON
kt.team_id = 1.id
";
?>
en ik krijg "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource". Oftewel, de query is niet goed, maar wat doe ik fout?
Gewijzigd op 01/01/1970 01:00:00 door KrissCross
Iemand die me hiermee kan helpen, want ben er nog steeds niet uit?
Quote:
Zou je dan voortaan niet even de mysql foutmelding ook echoën? Gebruik mysql_error() om die foutmelding op te halen als blijkt dat een query mislukt is...Oftewel, de query is niet goed, maar wat doe ik fout?
Noppes schreef op 20.07.2008 20:26:
Tja, je mag geen aliassen aanmaken welke met een nummertje beginnen
Oke thanx!
Ik heb nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$teamkleuren = "SELECT
tabel1.naam,
tabel2.kleur_naam
FROM
tabel1
INNER JOIN
(tabel2
INNER JOIN
koppeltabel AS kt
ON
kt.kleur_id = tabel2.id
)
ON
kt.team_id = tabel1.id
";
?>
$teamkleuren = "SELECT
tabel1.naam,
tabel2.kleur_naam
FROM
tabel1
INNER JOIN
(tabel2
INNER JOIN
koppeltabel AS kt
ON
kt.kleur_id = tabel2.id
)
ON
kt.team_id = tabel1.id
";
?>
En dat werkt.
Als ik vervolgens de resultaten weergeef in een tabel dmv
dan krijg ik het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
+---------+----------+
| team | kleuren |
+---------+----------+
| Toyota | Rood |
| Nissan | Geel |
| Nissan | Groen |
| Mazda | Rood |
| Mazda | Groen |
+---------+----------+
| team | kleuren |
+---------+----------+
| Toyota | Rood |
| Nissan | Geel |
| Nissan | Groen |
| Mazda | Rood |
| Mazda | Groen |
+---------+----------+
Dit klopt, maar ik wil het nu zo weergeven:
maar krijg ook dit weer niet voor elkaar :(
Ps: dat normaliseren van mijn database maakt t me niet echt makkelijker
Gewijzigd op 01/01/1970 01:00:00 door KrissCross
Maar het voorkomt in de toekomst wel fouten. Laat met PHP iets meelopen die bepaald of het automerk nog hetzelfde is:
Ja, maar in mijn echte database kan mijn team meerdere kleuren, sponsors en rijders hebben :|
Dat is imho bijna niet te doen met if-jes.
Mijn oplossing tot nu toe is voor elke variabele een
draaien en dan de array elke keer resetten. Maar dit is niet echt een elegante oplossing...
Gewijzigd op 01/01/1970 01:00:00 door KrissCross
PHPerik schreef op 21.07.2008 12:15:
Kijk eens naar de MySQL-only functie GROUP_CONCAT, daarmee bereik je wat jij wil: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
That does the trick! Mijn dank is groot!