Koppeltabel gegeven bewerken
Ik had de volgende probleem. In mijn database gebruik ik een koppeltabel om meerdere gegevens aan een gebruiker toe tevoegen. Nu ziet mijn database er als volgt uit:
Tabel 1 auto
autoid
autonaam
enz
Tabel 2 autocon
autoid
gebruikersid
Tabel 3 gebruiker
gebruikerid
naam
enz
Als ik deze invoer gaat alles goed. Alleen als ik ze wil bewerken. Hoe kan ik dan zeggen dat die geen die al aan de gebruiker zijn gekoppeld geselecteerd zijn en die geen die nog niet aan de gebruiker zijn gekoppeld die ook laat zien, maar dan niet geselecteerd. Zodat je die ook kan toevoegen?
Groet,
Kees
De gebruiker moet gekoppeld worden aan autocon of aan auto? Dan kun je toch kijken of er in auto of autocon (weet niet wat de relaties zijn) een gebruikersid is met het gebruikersid van de gebruiker die je op dat moment uit de database selecteert?
bv. http://www.w3schools.com/sql/sql_join_inner.asp
Het verschil tussen LEFT JOIN, RIGHT JOIN en INNER JOIN goed bekijken.
"SELECT user.*, autocon.*, auto.* FROM user INNER JOIN autocon ON (user.userid = autocon.userid) INNER JOIN auto ON (autocon.autoid = auto.autoid) WHERE `user`.userid = $_GET[id]";
Als ik je goed begrijp wil je een overzicht van alle auto's met of zonder gekoppelde gebruiker, je krijgt dan zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
SELECT
a.autoid a_id,
a.autonaam a_naam,
g.gebruikerid g_id,
g.naam g_naam
FROM auto a
LEFT JOIN
(autocon k
INNER JOIN
gebruiker g ON k.gebruikerid = g.id
)
ON a.autoid = k.autoid
a.autoid a_id,
a.autonaam a_naam,
g.gebruikerid g_id,
g.naam g_naam
FROM auto a
LEFT JOIN
(autocon k
INNER JOIN
gebruiker g ON k.gebruikerid = g.id
)
ON a.autoid = k.autoid
Gewijzigd op 31/01/2012 15:07:48 door Ger van Steenderen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
<tr valign="baseline">
<td nowrap="nowrap" align="right">Koppel aan:</td>
<td>
[code]<?php
do {
?>
<input type="checkbox" name="autoid[<?php echo $row_uss['autoid']?>]" id="autoid" value="1"><?php echo $row_uss['autonaam']?></option>
<?php
} while ($row_uss = mysql_fetch_assoc($uss));
$rows = mysql_num_rows($uss);
if($rows > 0) {
mysql_data_seek($uss, 0);
$row_uss = mysql_fetch_assoc($uss);
}
?>
</td>
</tr>
?>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Koppel aan:</td>
<td>
[code]<?php
do {
?>
<input type="checkbox" name="autoid[<?php echo $row_uss['autoid']?>]" id="autoid" value="1"><?php echo $row_uss['autonaam']?></option>
<?php
} while ($row_uss = mysql_fetch_assoc($uss));
$rows = mysql_num_rows($uss);
if($rows > 0) {
mysql_data_seek($uss, 0);
$row_uss = mysql_fetch_assoc($uss);
}
?>
</td>
</tr>
?>
Hiermee laat die dan ook precies zien welke auto's erbij de gebruiker horen. Alleen niet de geen die er wel zijn maar nog niet zijn toegewezen aan de gebruiker.
Zie mijn vorige post. Jij gebruikt een INNER JOIN en dan krijg je geen rijen terug waarvan de JOIN voorwaarden niet overeenkomen.
Ik heb het stukje zoals jij het had geschreven overnomen en toegevoegd, maar krijg precies het zelfde resultaat terug als voorheen.
Is het zo dat er meerdere gebruikers aan 1 auto gekoppeld kunnen zijn?
Ja dit is de bedoeling
Kees - op 31/01/2012 14:43:38:
Ik heb het stukje zoals jij het had geschreven overnomen en toegevoegd, maar krijg precies het zelfde resultaat terug als voorheen.
Lijkt me sterk, stond een fout in de sql.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
"SELECT
gebruiker.*,
autocon.*,
auto.*
FROM auto
LEFT JOIN (autocon
INNER JOIN
gebruiker ON autocon.gebruikerid = gebruiker.gebruikerid
)
ON auto.autoid = autocon.autoid
WHERE
gebruiker.gebruikerid = $_GET[id]";
?>
"SELECT
gebruiker.*,
autocon.*,
auto.*
FROM auto
LEFT JOIN (autocon
INNER JOIN
gebruiker ON autocon.gebruikerid = gebruiker.gebruikerid
)
ON auto.autoid = autocon.autoid
WHERE
gebruiker.gebruikerid = $_GET[id]";
?>
Gewijzigd op 31/01/2012 15:30:30 door Kees -
Kijk eens wat er gebeurt bij beide sql's
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
gebruiker.*,
autocon.*,
auto.*
FROM auto
RIGHT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
gebruiker.*,
autocon.*,
auto.*
FROM auto
RIGHT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
gebruiker.*,
autocon.*,
auto.*
FROM auto
LEFT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
gebruiker.*,
autocon.*,
auto.*
FROM auto
LEFT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
Bij de ene krijg je de auto's die niet gekoppeld zijn; bij de andere de gebruikers die niet gekoppeld zijn; dat juist met een keer een RIGHT JOIN, een andere keer met LEFT JOIN
Nu, dan heb je wel nog gegevens te veel; de sql kan ingekort worden.
@Kees: krijg je nu het verwachte resultaat?
Kris Peeters op 31/01/2012 15:56:20:
Okay ...
Kijk eens wat er gebeurt bij beide sql's
Bij de ene krijg je de auto's die niet gekoppeld zijn; bij de andere de gebruikers die niet gekoppeld zijn; dat juist met een keer een RIGHT JOIN, een andere keer met LEFT JOIN
Nu, dan heb je wel nog gegevens te veel; de sql kan ingekort worden.
Kijk eens wat er gebeurt bij beide sql's
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
gebruiker.*,
autocon.*,
auto.*
FROM auto
RIGHT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
gebruiker.*,
autocon.*,
auto.*
FROM auto
RIGHT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
gebruiker.*,
autocon.*,
auto.*
FROM auto
LEFT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
gebruiker.*,
autocon.*,
auto.*
FROM auto
LEFT JOIN (autocon
RIGHT JOIN gebruiker ON autocon.gebruikersid = gebruiker.gebruikerid
) ON auto.autoid = autocon.autoid
WHERE autocon.autoid IS NULL
Bij de ene krijg je de auto's die niet gekoppeld zijn; bij de andere de gebruikers die niet gekoppeld zijn; dat juist met een keer een RIGHT JOIN, een andere keer met LEFT JOIN
Nu, dan heb je wel nog gegevens te veel; de sql kan ingekort worden.
Ik krijg bij beide het zelde resultaat terug. Ik zie alleen de auto's die ik al had toegewezen aan de gebruiker.
Toevoeging op 31/01/2012 16:49:41:
Ger van Steenderen op 31/01/2012 16:36:57:
Allereerst is het onverstandig om * te gebruiken in een select query, zeker bij joins op meerdere tabellen. Je hebt meestal niet alle velden nodig uit de tabellen, en als je dezelfde veldnamen in tabellen hebt kun je wachten op een sql fout.
@Kees: krijg je nu het verwachte resultaat?
@Kees: krijg je nu het verwachte resultaat?
Ik weet dat dit niet de best manier is. Ik heb dit alleen gedaan even snel gedaan om te kijken of het wilt werken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
SELECT
a.autoid a_id,
a.autonaam a_naam,
g.gebruikerid g_id,
g.naam g_naam
FROM auto a
LEFT JOIN
(autocon k
INNER JOIN
gebruiker g ON k.gebruikerid = g.id
)
ON a.autoid = k.autoid
a.autoid a_id,
a.autonaam a_naam,
g.gebruikerid g_id,
g.naam g_naam
FROM auto a
LEFT JOIN
(autocon k
INNER JOIN
gebruiker g ON k.gebruikerid = g.id
)
ON a.autoid = k.autoid
Deze zou moeten werken (als je alle tabellen en velden hetzelfde noemt als ze in de db staan)