Hallo,

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
Ik heb hem nu zo staan:

<?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]";
?>
Okay ...

Kijk eens wat er gebeurt bij beide sql's


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



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


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.
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?
Kris Peeters op 31/01/2012 15:56:20

Okay ...

Kijk eens wat er gebeurt bij beide sql's


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



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


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.

[size=xsmall]Toevoeging op 31/01/2012 16:49:41:[/size]

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?


Ik weet dat dit niet de best manier is. Ik heb dit alleen gedaan even snel gedaan om te kijken of het wilt werken.
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

Deze zou moeten werken (als je alle tabellen en velden hetzelfde noemt als ze in de db staan)

Reageren