Toon posts:

[MySQL] Resultaat afhankelijk van data tweede tabel (joins?)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende query:
SQL:
1
2
3
4
5
6
SELECT
   members.id, members.name, locations.name
FROM
   members, locations
WHERE
   members.c_city = locations.id

Verder heb ik een tabel `options`, met drie velden (`id`, `member`, `option`), waarbij members.id = options.member. Van bovenstaande query wil ik alléén een record krijgen wanneer options.option = 'X' (bij members.id=option.member uiteraard)

Ik hoop dat het probleem een beetje duidelijk is, ik kom er met mijn kennis van JOINS niet helemaal uit. Kan iemand me een beetje op weg helpen?

  • cytherea
  • Registratie: Oktober 2003
  • Laatst online: 09:22
Verwijderd schreef op zondag 05 maart 2006 @ 20:28:
Ik heb de volgende query:
SQL:
1
2
3
4
5
6
SELECT
   members.id, members.name, locations.name
FROM
   members, locations
WHERE
   members.c_city = locations.id

Verder heb ik een tabel `options`, met drie velden (`id`, `member`, `option`), waarbij members.id = options.member. Van bovenstaande query wil ik alléén een record krijgen wanneer options.option = 'X' (bij members.id=option.member uiteraard)

Ik hoop dat het probleem een beetje duidelijk is, ik kom er met mijn kennis van JOINS niet helemaal uit. Kan iemand me een beetje op weg helpen?
Het kan zijn dat ik het niet helemaal snap (moest het 2 keer doorlezen...) maar een gewone WHERE options.option = "X" is geen oplossing?

[edit]
Met uiteraard de tabel enzo erbij gejoined...

[ Voor 6% gewijzigd door cytherea op 05-03-2006 20:33 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 08-04 20:00

Robtimus

me Robtimus no like you

Wat cytherea al zei: gewoon de drie tabellen joinen:
SQL:
1
2
3
SELECT members.id, members.name, locations.name
FROM (members INNER JOIN options ON members.id = options.member) INNER JOIN locations ON members.c_city = locations.id
WHERE options.option = 'X'
Die haakjes in de join zijn niet helemaal nodig maar maakt het leesbaarder.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
@cytherea:
Nee, in dit geval voegt hij een kolom `option` toe, waarbij de waarde X is, bij alle records. Het is de bedoeling dat hij selecteert. Even een verduidelijking:

code:
1
2
3
4
5
6
7
8
Tabel `options`

id    member    option
1     5         2
2     3         4
3     3         3
4     1         6
5     4         6

Stel dat X=6 (options.option), dan wil ik uit tabel `members` alleen de records waarbij members.id = 1 en members.id = 4, aangezien deze matchen met options.option = 6

@IceManX:
Dit werkt inderdaad, bedankt! Ik krijg die joins maar niet onder de knie :/

[ Voor 11% gewijzigd door Verwijderd op 05-03-2006 20:52 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 08-04 20:00

Robtimus

me Robtimus no like you

Met een join combineer je 2 of meer tabellen. Wat je doet, qua syntax: je geeft de "linker" tabel weer, dan het join type*, dan de "rechter" tabel, gevolgd door het woordje "ON" en de velden zoals ze gelijk aan elkaar zijn. Dit kunnen er meerdere zijn.
Voorbeeld: table1 JOIN table2 ON table1.field1 = table2.field1 AND table1.field2 = table2.field2 AND table1.field3 <> table2.field3

Zoals je ziet mag een <> er dus ook in zitten!

* Er zijn de volgende JOIN types:
  • INNER JOIN: je neemt de combinatie zodanig dat in allebei de tabellen een record moet zitten voor de koppeling.
  • LEFT OUTER JOIN: als in de linker tabel een record zit dat geen passend veld in de rechter tabel heeft, dan wordt deze wel meegenomen in het resultaat maar hebben alle kolommen uit de rechter tabel de NULL waarde
  • RIGHT OUTER JOIN: het omgekeerde van de LEFT OUTER JOIN
  • FULL OUTER JOIN: zowel een LEFT OUTER JOIN als een RIGHT OUTER JOIN
  • CROSS JOIN: elk record in de linker tabel wordt gekoppeld aan elk record in de rechter tabel. Er is dus GEEN "ON" clausule.
Check anders http://www.w3schools.com/sql/sql_join.asp

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Dit verduidelijkt een hoop, bedankt!

In dat geval nog eentje (staat even los van de query in de OP):

Er is naast `options` nog een tabel `options_def`, bestaande uit (id, name, description), waarbij options_def.id = options.option.

Ik heb:
SQL:
1
2
3
4
SELECT
  name, description
FROM
  options_def

Makkelijk dus, maar nu wil ik nog een extra waarde erbij (naast name, description), namelijk options.id in het geval van een record in `options` wanneer options.options = options_def.id en options.member=X.

Zelf kwam ik op:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT
  options_def.name, options_def.description, options.id
FROM
  options_def
LEFT OUTER JOIN
  options
ON
  options_def.id = options.option
WHERE
  options.member=X

Hier krijg ik dus een goed result, maar alléén als er een geldige waarde in `options` voorkomt die met `options_def` matcht. Ik wil sowieso alle waarden terug van `options_def` en wanneer er een match met `options` is een extra waarde.

Ik hoop dat het weer een beetje duidelijk is :)

[ Voor 103% gewijzigd door Verwijderd op 05-03-2006 21:23 . Reden: Iets verduidelijkt ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 08-04 20:00

Robtimus

me Robtimus no like you

De options tabel is facultatief, dus het kan ook NULLs opleveren. Verander je WHERE clause dan ook even voor dat geval:
SQL:
1
WHERE options.member=X OR options.member IS NULL

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1