[Mysql] SELECT/JOIN probleempje

Pagina: 1
Acties:

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Oké, al een dik twee uur bezig met zoeken, ik kom er niet uit.

Voorbeeldje. Ik heb drie tabellen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Table: namen
-----------
id (int, prim key)
name (varchar)

Table: leden01
-----------
id (int, prim key)
naam_id (int)

Table: leden02
-----------
id (int, prim key)
naam_id (int)


Mijn doel is het hebben van alle namen die in één of allebei de tabellen voorkomen. Namen in table 'namen' die in geen van beide voorkomen (hun id) mogen niet worden geselecteerd.

Dit is de query die ik heb:
code:
1
2
3
4
SELECT  namen.name
FROM namen
LEFT JOIN leden01 ON leden01.id=namen.id
LEFT JOIN leden02 ON leden02.id=namen.id


Hiermee krijg ik toch alle namen in de table 'namen' te zien. Wat doe ik nu fout. Het zal vast en zeker heel simpel zijn...

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Probeer INNER JOIN eens.

Hoeft trouwens niet met een join, als ik goed begrijp wat je wilt:
code:
1
SELECT DISTINCT namen.name FROM namen, leden01, leden02 WHERE leden01.naam_id = namen.id OR leden02.naam_id = namen.id;

[ Voor 82% gewijzigd door CyBeR op 06-08-2004 01:24 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 14-05 15:52
[niet meer helemaal helder modus]
Iets in deze geest?
code:
1
2
3
4
5
SELECT namen.id, namen.name, if((leden01.id is NULL && leden02.id is NULL),0,1) as valid
FROM namen
LEFT OUTER JOIN leden01 ON leden01.id=namen.id
LEFT OUTER JOIN leden02 ON leden02.id=namen.id
HAVING valid=1


Misschien kan het wel veel simpeler, maar ik zie 't even niet dan ;)
[/niet meer helemaal helder modus]

@CyBeR:

Volgens mij gaat het fout zoals je het nu zegt. Dat is toch een (Inner join) en dan moet de namen.id in bij leden tabellen voorkomen anders komt er geen rij. De TS wil dat het lid minimaal in een van beiden voorkomt,
Je zult dus IMHO alletwee de tabellen moeten left (outer) joinen, waarbij er dus NULL waarden ontstaan in het resultaat. Alleen de resultaten met NULL waarden op beide gejoinde tabellen die willen we niet. Alleen gaat dat dan niet meer met een where en zul je een having moeten gebruiken. Omdat je dus nog een extra filter wilt zetten op de resultaten.

[ Voor 44% gewijzigd door beetle71 op 06-08-2004 01:30 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Ik denk dat je database model nogal brak is. Je hebt 2 tabellen met praktisch dezelfde naam... 8)7 Dat is meestal een teken van een slecht genormaliseerde database.

Deze query zou moeten doen wat jij wil...
code:
1
2
3
4
SELECT namen.id, namen.name
FROM namen
WHERE id IN (SELECT id FROM leden01)
OR id IN (SELECT id FROM leden02)

Werkt wel pas vanaf MySQL versie 4.1 oid.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Iedereen bedankt, ik ben eruit.

@ NMe84:
Wat ik hier gaf is een voorbeeld om mijn probleem zo eenvoudig mogelijk te kunnen schetsen. :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

robertpNL schreef op 06 augustus 2004 @ 08:57:
Iedereen bedankt, ik ben eruit.

@ NMe84:
Wat ik hier gaf is een voorbeeld om mijn probleem zo eenvoudig mogelijk te kunnen schetsen. :)
Misschien handig als je erbij zegt wat de oplossing was, dan heeft iemand die dit topic in de search tegen komt er ook nog wat aan. :)
Verder weet ik niet in hoeverre je alles vereenvoudigd hebt, maar als je ook maar enigszins twijfelt aan de normalisatie van je database, dan zou ik het toch maar eens goed opnieuw bekijken. Als het goed genormaliseerd is dan heb ik niks gezegd. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1