Probleem met JOIN

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

KrissCross

KrissCross

17/06/2008 18:03:00
Quote Anchor link
Ik ben nu eindelijk mijn database aan het normaliseren, alleen stuit op het volgende probleem. Er zijn 2 tabellen:

tabel1:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+----------+
| id | kleur    |
+----+----------+
|  1 | Rood     |
|  2 | Geel     |
|  3 | Groen    |
+----+----------+

en tabel2:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+----------+----------+
| 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)
PHP script in nieuw venster Selecteer het PHP script
1
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

Maar hoe moet ik deze tabellen nu joinen?
Gewijzigd op 01/01/1970 01:00:00 door KrissCross
 
PHP hulp

PHP hulp

19/04/2024 10:59:55
 
Jesper Diovo

Jesper Diovo

17/06/2008 18:12:00
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT a.kleur, b.merk
FROM tabel1 AS a,
tabel2 AS b
WHERE
  a.id = b.kleur_id;
Gewijzigd op 01/01/1970 01:00:00 door Jesper Diovo
 
KrissCross

KrissCross

17/06/2008 18:25:00
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
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.
 
Joren de Wit

Joren de Wit

17/06/2008 18:28:00
Quote Anchor link
@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.
 
Jurgen assaasas

Jurgen assaasas

17/06/2008 19:46:00
Quote Anchor link
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.
 
Storeman storeman

storeman storeman

17/06/2008 19:52:00
Quote Anchor link
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.
 
Joren de Wit

Joren de Wit

17/06/2008 19:55:00
Quote Anchor link
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...
 
Jan Aart

Jan Aart

17/06/2008 20:05:00
Quote Anchor link
Volgens mij zou het database model er dan zo uit zien:

TABEL kleuren
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----------+--------+
| kleur_id | naam   |
+----------+--------+
|  1          | Rood   |
|  2          | Geel    |
|  3          | Groen  |
+----------+-------- +


TABEL APK (Auto's per Kleuren)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+---------+----------+----------+
| APK_id  | merk_id | kleur_id |
+---------+----------+----------+
|  1         | 1           | 1           |
|  2         | 1           | 2           |
|  3         | 2           | 1           |
+---------+----------+----------+


TABEL automerken
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+-----------+----------+
| merk_id  | naam     |
+-----------+----------+
|  1           | Toyota   |
|  2           | Nissan   |
|  3           | Mazda    |
+-----------+----------+


Verbeter me als ik het fout doe :)
 
Joren de Wit

Joren de Wit

17/06/2008 20:09:00
Quote Anchor link
@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.
 
KrissCross

KrissCross

17/06/2008 22:50:00
Quote Anchor link
@ 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.
 
KrissCross

KrissCross

17/07/2008 09:46:00
Quote Anchor link
Oke, ik heb nu het volgende (genormaliseerde) datamodel (hier versimpeld weergegeven):

tabel1:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+----------+
| id | team     |
+----+----------+
|  1 | Toyota   |
|  2 | Nissan   |
|  3 | Mazda    |
+----+----------+

tabel2:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
+----+---------------+
| id | kleur_naam    |
+----+---------------+
|  1 | Rood          |
|  2 | Geel          |
|  3 | Groen         |
+----+---------------+

en tenslotte de koppeltabel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
+----------+----------+
| 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
 
Robert Deiman

Robert Deiman

17/07/2008 09:57:00
Quote Anchor link
Misschien heb je hier wat aan?
 
KrissCross

KrissCross

19/07/2008 13:27:00
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
            "
;
?>

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
 
KrissCross

KrissCross

20/07/2008 20:17:00
Quote Anchor link
Iemand die me hiermee kan helpen, want ben er nog steeds niet uit?
 
Noppes

Noppes

20/07/2008 20:26:00
Quote Anchor link
Tja, je mag geen aliassen aanmaken welke met een nummertje beginnen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
   table1.naam,
   table2.kleur_naam
FROM
    table1
   INNER JOIN koppeltabel
           ON table1.id=koppeltabel.team_id
   INNER JOIN table2
           ON koppeltabel.kleur_id=table2.id
 
Joren de Wit

Joren de Wit

20/07/2008 20:43:00
Quote Anchor link
Quote:
Oftewel, de query is niet goed, maar wat doe ik fout?
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...
 
KrissCross

KrissCross

21/07/2008 10:55:00
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
            "
;
?>

En dat werkt.
Als ik vervolgens de resultaten weergeef in een tabel dmv
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    while ($row = mysql_fetch_array($teamkleuren));
?>

dan krijg ik het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
+---------+----------+
| team    |  kleuren |
+---------+----------+
| Toyota  |  Rood    |
| Nissan  |  Geel    |
| Nissan  |  Groen   |
| Mazda   |  Rood    |
| Mazda   |  Groen   |
+---------+----------+

Dit klopt, maar ik wil het nu zo weergeven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Toyota: Rood
Nissan: Geel Groen
Mazda: Rood Groen

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
 
Robert Deiman

Robert Deiman

21/07/2008 11:36:00
Quote Anchor link
@KrisKross

Maar het voorkomt in de toekomst wel fouten. Laat met PHP iets meelopen die bepaald of het automerk nog hetzelfde is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$last_car
= '';
while($row=mysql_fetch_assoc($result)){
    if($last_car == $row['team']){
       //komt overeen, dus nog geen nieuwe regel aanmaken alleen kleur invullen
       echo ' '.$row['kleur'];
       }

    else{
       //nieuw team, dus nieuwe regel
       echo '<br />'.$row['team'].':';
       }
    }

?>
 
KrissCross

KrissCross

21/07/2008 11:46:00
Quote Anchor link
@ Robert

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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
while($row=mysql_fetch_assoc($result))
?>

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
 
PHP erik

PHP erik

21/07/2008 12:15:00
Quote Anchor link
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
 
KrissCross

KrissCross

21/07/2008 14:52:00
Quote Anchor link
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!
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.