[MYSQL]Join probleem

Pagina: 1
Acties:

  • Soef
  • Registratie: Februari 2001
  • Laatst online: 03-02-2023

Soef

-Soef^IO-

Topicstarter
Mensen,

Ik heb een probleem dat verschillende mensen onder ons vast wel eens eerder mee hebben gemaakt:

Stelling: Je hebt 2 tabellen. in het ene tabel bijvoorbeeld auto's:
code:
1
2
3
4
5
6
ID     TYPE
1    Opel
2    Peugot
3    Renault
4    VW
5    MiniCooper


In het 2e tabel staan koppelingen met een gebuiker-id, want 1 gebruiker kan meerdere auto's bezitten (meer op meer relatie):
code:
1
2
3
4
5
6
autoID    userID
1              4
1              3
2              4
3              5
2              5


Nu wil ik weergeven welke auto's een gebruiker nog NIET heeft. Er moet dus een SQL query komen die er voor zorgt dat alle auto's van het auto tabel worden gehaald, waar het het autoID met de betreffende gebruiker niet bestaat. Poging 1 (userID = 5):

SELECT type FROM auto LEFT JOIN auto_gebruiker ON autoID = ID AND userID = 5 WHERE ID IS NULL

Probleem: Heel logisch en verwacht krijg je nu alleen de auto die nog door NIEMAND in bezig zijn. dus alleen de VW en de MiniCooper.

Poging 2:

SELECT type FROM auto LEFT JOIN auto_gebruiker ON autoID = ID AND userID = 5 WHERE ID IS NULL OR userID != 5

Probleem: Ook wel logisch maar verdomd jammer; We willen alles zien behalve de Peugot en de Renault, MAAR!! maar, Peugot komt toch in de lijst omdat een andere gebruiker deze ook heeft...

Een oplossing kan zijn om eerst alle koppelingen met de huidige gebruiker uit de database te halen. en dan de auto te selecteren met een eindeloze WHERE string als in " WHERE ID != 1 AND ID != 2 AND ID != 3 etc...".

Dit is in dit voorbeeld nog best te doen, maar een zelfde situatie heb ik nu waar wel iets van 30~40 van die dingen voor kunnen komen. En ik vind het dan niet echt een nette oplossing. Heeft iemand voor mij een oplossing zodat ik dit in 1 query kwijt kan?

Some things can not happen until they happen...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:49

Creepy

Tactical Espionage Splatterer

Ik gok erop dat je met een subquery en een NOT IN prima uit de voeten kan ;)
(mits je natuurlijk geen MySQl < 4.0 draait).

code:
1
2
select ID from auto where ID not in (
select autoID from auto_gebruiker where userID = 5)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Soef
  • Registratie: Februari 2001
  • Laatst online: 03-02-2023

Soef

-Soef^IO-

Topicstarter
Creepy schreef op 09 augustus 2004 @ 12:00:
Ik gok erop dat je met een subquery en een NOT IN prima uit de voeten kan ;)
(mits je natuurlijk geen MySQl < 4.0 draait).

code:
1
2
select ID from auto where ID not in (
select autoID from auto_gebruiker where userID = 5)
Deze heb ik ook al geprobeerd, maar het probleem is dat je hiervoor een mysql server versie > 4.1 moet hebben. En aangezien deze nog niet stable is, gaan we deze niet gebruiken. 4.0.18 gebruiken we en deze ondersteund nog geen sub-queries...

[ Voor 3% gewijzigd door Soef op 09-08-2004 12:06 ]

Some things can not happen until they happen...


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Je kan dat herschrijven dmv een OUTER JOIN te gebruiken en te checken op de NULL waarden.

code:
1
2
3
select id from auto
LEFT OUTER JOIN auto_gebruiker ON ....
WHERE auto_gebruiker.autoId IS NULL

Nuja, zoiets ongeveer. Je zal wel nog ff met die query moeten sleutelen, maar you'll catch the drift.

https://fgheysels.github.io/