Ik ben nu eindelijk mijn database aan het normaliseren, alleen stuit op het volgende probleem. Er zijn 2 tabellen:

tabel1:

+----+----------+
| id | kleur    |
+----+----------+
|  1 | Rood     |
|  2 | Geel     |
|  3 | Groen    |
+----+----------+

en tabel2:

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

SELECT
    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?
Je hoeft niet altijd te joinen. Je kunt ook gewoon meerdere tabellen selecteren. Met één extra WHERE-eis kun je dan ook al de juiste data selecteren.


SELECT a.kleur, b.merk
FROM tabel1 AS a,
tabel2 AS b
WHERE
  a.id = b.kleur_id;
Jezpur schreef op 17.06.2008 18:12
Je hoeft niet altijd te joinen. Je kunt ook gewoon meerdere tabellen selecteren. Met één extra WHERE-eis kun je dan ook al de juiste data selecteren.


SELECT a.kleur, b.merk
FROM tabel1 AS a,
tabel2 AS b
WHERE
  a.id = b.kleur_id;


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.
@Jezpur: ook dat is een JOIN, en wel een INNER JOIN. Het is alleen een andere (minder duidelijke) schrijfwijze.

@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.
Oefenen en proberen :), normaliseren is stap 1, zoals Blanche aangeeft, je zult een koppeltabel moeten maken, zodat meerdere auto's meerdere kleuren kunnen hebben (dus een veel-op-veel-relatie).

Meer tabellen is niet trager of slechter, met dat in het achterhoofd en goede wil moet je een eind kunnen komen.
Je hebt het over 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...

Volgens mij zou het database model er dan zo uit zien:

TABEL kleuren

+----------+--------+
| kleur_id | naam   |
+----------+--------+
|  1          | Rood   |
|  2          | Geel    |
|  3          | Groen  |
+----------+-------- +


TABEL APK (Auto's per Kleuren)

+---------+----------+----------+
| APK_id  | merk_id | kleur_id |
+---------+----------+----------+
|  1         | 1           | 1           |
|  2         | 1           | 2           |
|  3         | 2           | 1           |
+---------+----------+----------+


TABEL automerken

+-----------+----------+
| merk_id  | naam     | 
+-----------+----------+
|  1           | Toyota   | 
|  2           | Nissan   | 
|  3           | Mazda    |
+-----------+----------+


Verbeter me als ik het fout doe :)
@Jan: bijna goed :-)

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.
@ Blanche: Oke, verder normaliseren dus. Dank.

@ Jan Aart: Bedankt voor de opzet, nu begrijp ik net iets beter wat het idee moet zijn van de koppeltabel.
Oke, ik heb nu het volgende (genormaliseerde) datamodel (hier versimpeld weergegeven):

tabel1:

+----+----------+
| id | team     |
+----+----------+
|  1 | Toyota   |
|  2 | Nissan   |
|  3 | Mazda    |
+----+----------+

tabel2:

+----+---------------+
| id | kleur_naam    |
+----+---------------+
|  1 | Rood          |
|  2 | Geel          |
|  3 | Groen         |
+----+---------------+

en tenslotte de koppeltabel:

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

Reageren