Toon posts:

[SQL] dubbele join : kan dat?*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel voor je hebt een tabel gebruikers:
id int
naam char(20)

en een tabel todo
id int
(nog wat shit)
todo_starter_id int
todo_behandeld_id int

deze slaan dus allebij op de tabel gebruikers nu weet ik wel hoe je 1 veld kunt joinen maar nu heb ik meerdere velden in 1 tupel.

dus dat resultaat bv is
idtodo_starter_idtodo_behandeld_id
1henkjan
2jansjaak
3robjan



Kan dit?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-08 10:39

Janoz

Moderator Devschuur®

!litemod

ja, dat kan. De uitkomst van een join is een nieuwe tabel. Met deze tabel kun je vervolgens weer dan wat je met een normale tabel ook zou kunnen doen (enkele uitzonderingen) zoals bijvoorbeeld joinen :). Let er wel op dat je beide instancies van de gebruikers tabel anders noemt (mbv as)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
/hier stond onzin, vraag verkeerd begrepen/ :)

[ Voor 86% gewijzigd door RobIII op 06-03-2003 11:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Het is zelfs standaard SQL.
code:
1
2
3
4
5
6
7
8
9
10
11
12
select
  a.todonaam,
  b.username,
  c.username
from
  todo a,
 gebruikers b,
 gebruikers c
where
  a.todo_starter_id=b.userid
and
  a.todo_behandeld_id=c.userid

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
ik heb op dit moment de volgende query
SELECT todo.*, user.naam FROM todo LEFT JOIN user ON user.id=todo.do_user_id
heb as a achter join user as a
en achter user_id as a
en natuurlijk ook a.naam in select maar krijg elke keer error:
You have an error in your SQL syntax near 'as g' at line 1
of moet ik per see de join maken met where doe dit nl liever nie

  • Dido
  • Registratie: Maart 2002
  • Nu online

Dido

heforshe

Zet nou eens neer wa je precies hebt... hier is weinig uit af te leiden...

Wat betekent mijn avatar?


Verwijderd

Topicstarter
ik snap 2 posting terug de query hoe dit moet maar ik wil de where ontwijken want daar leg je de join in de where dat wil ik niet wil het met inner join doen.
als dat teminste kan

dus ik dacht bv zo de query zou moeten doen
SELECT todo.*, a.naam, b.naam FROM todo LEFT JOIN user ON user.id=todo.do_user_id as a, user as b
maar dan krijg ik sql error

  • Dido
  • Registratie: Maart 2002
  • Nu online

Dido

heforshe

Kijk dan nog eens heel goed :)

Een tabel geef je een alias met "as x", vervolgens qualificeer je je veden met "x.", niet met veldnaam as x!
(veldnaam as x kan wel in je select, maar dat heeft een heel andere functie.)

In jouw query snap ik (laat staan SQL!) niet uit welke tabel(len) je iets wilt hebben en welke velden uit welke tabellen waaraan moeten voldoen...

Wat betekent mijn avatar?


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-08 10:39

Janoz

Moderator Devschuur®

!litemod

Gezien je de juiste oplossing van dusty naast je neer legt en het persee met joins wilt doen nog een paar tips.

Zet die as a (beetje duidelijker! mag, waarom niet starter) eens achter de user tabel. Zet vervolgens eens haakjes om het dtuk van todo tot en met de vergelijking. Beschouw wat tussen de haakjes staat ff als 1 tabel waarin de starternaam al is ingevuld. Hoe zou je daar de user tabel mee joinen waneer je user_behandeld_id van die 'tussenhaakjes tabel' wilt koppelen aan id van user?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Heb het dan toch maar op vorige beschreven manier gedaan maar sommige todo's zijn nog niet in behandeling genomen en is er nog geen gehandeld_id dus tging toch weer niet nou doe ik gewoon aparte query's tnx all

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 14-07 14:28

thomaske

» » » » » »

Daarom is een left join weer handig :)

combinatie van 'normale' en left join:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
  a.todonaam,
  b.username,
  c.username
FROM
    todo a,
    gebruikers b
LEFT JOIN 
    gebruikers c
ON
    a.todo_behandeld_id=c.userid    
WHERE
  a.todo_starter_id=b.userid

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Indien je de default op 0 zet van de todo velden kan je de gebruiker met ID 0 op "onbehandeld" zetten, waardoor er verschillende queries een stuk algemener opgelost kunnen worden.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1