Toon posts:

[MySQL] Dubbele join op zelfde tabel?

Pagina: 1
Acties:
  • 125 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Stel ik heb dit

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    bla.iets
    bla.user_id
    bla.f_user_id
    bla.text
    user.username
FROM
    bla
LEFT JOIN
    user
ON
    user.id = bla.user_id
WHERE
    bla.id=1


bv :)

nu wil ik een dubbele left join doen om username omdat ik wil weten van welke user wat afkomt en naar welke user het gaat (niet qua id maar ook qua naam) dan is dit onmogelijk... teminste in phpmyadmin

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    bla.iets
    bla.user_id
    bla.f_user_id
    bla.text
    user.username
FROM
    bla
LEFT JOIN
    user
ON
    user.id = bla.user_id
LEFT JOIN
    user
ON
    user.id = bla.f_user_id
WHERE
    bla.id=1


Is er een mogelijkheid dat ik dit wel voor elkaar krijg?

  • WimB
  • Registratie: Juli 2001
  • Laatst online: 30-03-2024
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    bla.iets
    bla.user_id
    bla.f_user_id
    bla.text
    u1.username
FROM
    bla
LEFT JOIN
    user AS u1
ON
    u1.id = bla.user_id
LEFT JOIN
    user AS u2
ON
    u2.id = bla.f_user_id
WHERE
    bla.id=1

Werkt zoiets, met een AS ?

Verwijderd

ik snap je voorbeeld syntax niet helemaal..... berust niet echt op de werkelijkheid zeker ;)

dubbele join gaat iig door een alias voor de tabel aan te maken
code:
1
2
3
4
5
6
7
8
9
10
 SELECT usr1.username, usr2.username
FROM users usr1
LEFT JOIN
 user usr2 
ON usr1.id=usr2.id
LEFT JOIN
 bla 
ON bla.id=usr2.id
WHERE
etc


dit is ook maar een dom voorbeeldje, en het zal niet werken bij jou.... :) maar denk dat je nu wel ziet hoe t werkt

Verwijderd

WimB schreef op 24 september 2002 @ 22:24:
Werkt zoiets, met een AS ?
werkt gewoon als je <b>tabelnaam</b> SPATIE <b>alias_voor_de_tabel</b> gebruikt :)

Verwijderd

Topicstarter
k Tnx ppl! :)

Verwijderd

In T-SQL (Sybase) gaat dat als volgt:

SELECT
bla.iets,
bla.user_id,
bla.f_user_id,
bla.text,
van_user.username "Van",
naar_user.username "Naar"
FROM
bla,
user van_user,
user naar_user
where
(van_user.id = bla.user_id) and
(naar_user.id = bla.f_user_id) and
(bla.id = 1)

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

dusty

Celebrate Life!

En de oplossing van jgkersemakers werkt dus ook gewoon op MySQL. (ik geef er persoonlijk zelfs de voorkeur aan boven de "Left Join" oplossing.

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


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 25 september 2002 @ 07:27:
In T-SQL (Sybase) gaat dat als volgt:

SELECT
bla.iets,
bla.user_id,
bla.f_user_id,
bla.text,
van_user.username "Van",
naar_user.username "Naar"
FROM
bla,
user van_user,
user naar_user
where
(van_user.id = bla.user_id) and
(naar_user.id = bla.f_user_id) and
(bla.id = 1)
En waar is de LEFT JOIN gebleven? Ik ben bang dat dit niet helemaal gaat werken.

Never underestimate the power of


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

dusty

Celebrate Life!

cameodski schreef op 25 september 2002 @ 10:30:
[...]
En waar is de LEFT JOIN gebleven? Ik ben bang dat dit niet helemaal gaat werken.

Dit gaat prima werken, waar is jouw SQL kennis gebleven?

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


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

cameodski schreef op 25 september 2002 @ 10:30:
En waar is de LEFT JOIN gebleven? Ik ben bang dat dit niet helemaal gaat werken.

Er staan toch joins in :?
Niet alles MOET met een left join hoor ;)

Sterker nog, imho wordt de left join veel te vaak gebruikt door mensen hier.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
dusty schreef op 25 september 2002 @ 10:35:

[...]

Dit gaat prima werken, waar is jouw SQL kennis gebleven?
Die SQL kennis is er nog steeds hoor. :)
Wat mij opviel, was dat de TS een LEFT JOIN gebruikte en dat er opeens oplossingen werden gepost waarin die LEFT JOIN was verdwenen.

En of hier een LEFT JOIN nodig is? Zou maar zo kunnen van niet.

Never underestimate the power of


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

dusty

Celebrate Life!

ACM schreef op 25 september 2002 @ 11:37:
[nohtml]
[...]
[/nohtml]
Sterker nog, imho wordt de left join veel te vaak gebruikt door mensen hier.

Zei ik dat een aantal maanden geleden al niet? :+

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


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

cameodski schreef op 25 september 2002 @ 11:52:
Wat mij opviel, was dat de TS een LEFT JOIN gebruikte
nu wil ik een dubbele left join doen om username omdat ik wil weten van welke user wat afkomt en naar welke user het gaat
Hij wil twee keer een join op de user tabel, maar noemt dat "left join" ofzo, of het wel of niet nodig is weet ik niet, bij een goed model en gebruik van de db zullen er geen missende users zijn en is een outer join echt niet nodig imho :)
dusty schreef op 25 september 2002 @ 11:55:
Zei ik dat een aantal maanden geleden al niet? :+
Zou best kunnen, kan niet vaak genoeg gezegd worden, vind je niet? :)

  • whoami
  • Registratie: December 2000
  • Nu online
dusty schreef op 25 september 2002 @ 11:55:
[nohtml]
[...]
[/nohtml]
Zei ik dat een aantal maanden geleden al niet? :+



dat zei ik ook al eens.... Iedereen gebruikt hier die imho 'lelijke' syntax, terwijl het evengoed veel duidelijker en (imho) eenvoudiger kan.

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
whoami schreef op 25 september 2002 @ 14:53:
dat zei ik ook al eens.... Iedereen gebruikt hier die imho 'lelijke' syntax, terwijl het evengoed veel duidelijker en (imho) eenvoudiger kan.
Als je het gebruik van het keyword JOIN lelijk en onduidelijk vindt, dan begrijp ik niet waarom. Als je iets anders bedoelt, begrijp ik niet wat je bedoelt.

Never underestimate the power of


  • whoami
  • Registratie: December 2000
  • Nu online
cameodski schreef op 25 september 2002 @ 16:42:
[...]

Als je het gebruik van het keyword JOIN lelijk en onduidelijk vindt, dan begrijp ik niet waarom. Als je iets anders bedoelt, begrijp ik niet wat je bedoelt.


Het is toch veel overzichtelijker en duidelijker als je gewoon uw select als volgt schrijft:

code:
1
2
select * from tabel1, tabel2
WHERE tabel1.id = tabel2.fk

https://fgheysels.github.io/


Verwijderd

whoami schreef op 25 september 2002 @ 16:44:

[...]


Het is toch veel overzichtelijker en duidelijker als je gewoon uw select als volgt schrijft:

code:
1
2
select * from tabel1, tabel2
WHERE tabel1.id = tabel2.fk
Hail to whoami! Joins zijn vervelend, heb gelukkig bij mijn db vakken vooral de WHERE a.ID = b.FK methode gekregen.

Joins zijn alleen praktisch als je alle records uit een tabel wil hebben, ook als ze geen gerelateerde records in de andere tabel hebben.

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

dusty

Celebrate Life!

ACM schreef op 25 september 2002 @ 11:59:
Zou best kunnen, kan niet vaak genoeg gezegd worden, vind je niet? :)

kan inderdaad nooit vaak genoeg zeggen dat mensen hier de expliciete JOINS te vaak gebruiken.

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


Verwijderd

Verwijderd schreef op 25 september 2002 @ 16:47:
[...]


Hail to whoami! Joins zijn vervelend, heb gelukkig bij mijn db vakken vooral de WHERE a.ID = b.FK methode gekregen.

Joins zijn alleen praktisch als je alle records uit een tabel wil hebben, ook als ze geen gerelateerde records in de andere tabel hebben.
Da's met alleen een outer join toch dan?

inner join maakt links en rechts niets uit.

Ik doe het zelf ook altijd met WHERE, vind ik veel overzichtelijker. Op school wordt alleen beweert dat JOIN overzichtelijker is :)

Verwijderd

Verwijderd schreef op 25 september 2002 @ 17:00:
[...]


Da's met alleen een outer join toch dan?
Ja dat klopt. In mijn ogen ook de enige nuttige join-vorm..
inner join maakt links en rechts niets uit.

Ik doe het zelf ook altijd met WHERE, vind ik veel overzichtelijker. Op school wordt alleen beweert dat JOIN overzichtelijker is :)
Op de UvT (KUB) gelukkig niet! Alles met WHERE :*)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 25 september 2002 @ 17:00:
Op school wordt alleen beweert dat JOIN overzichtelijker is :)
Gelukkig, er zijn ook nog goeie scholen in Nederland. :)

Waarom zou WHERE .... overzichtelijker zijn?
Ga eens een zeer uitgebreide query met bijvoorbeeld 30 joins maken. Voeg er ook nog eens een fikse doos echte(!) filters aan toe. Krijg je een enorme hoeveelheid AND statements, waar je gewoon helemaal stil van wordt. En zie de echte filters nog maar eens terug te vinden. En welke filter hoorde nou ook al weer bij welke join?
Dat wordt echt een enorme puinhoop en het is dus ook nauwelijks meer leesbaar.
En ook wel handig als je OUTER en CROSS JOINS op dezelfde manier kunt tonen. Een beetje standaardisatie is ook wel goed voor de leesbaarheid.

Never underestimate the power of


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 25 september 2002 @ 17:00:
Da's met alleen een outer join toch dan?

inner join maakt links en rechts niets uit.

Ik doe het zelf ook altijd met WHERE, vind ik veel overzichtelijker. Op school wordt alleen beweert dat JOIN overzichtelijker is :)

Left en right joins zijn dan over het algemeen ook outer joins :)

Wat dus ook een deel van het probleem is, je veranderd zomaar ineens je query naar iets waar het niet meer verplicht is dat er een bijbehorende key in de andere tabel is...
cameodski schreef op 25 september 2002 @ 18:12:
Gelukkig, er zijn ook nog goeie scholen in Nederland. :)

Waarom zou WHERE .... overzichtelijker zijn?
Oracle kende de outer join (expliciet dan, dmv *= en =* wel) niet eens in voorgaande versies.
Maar verder is het overzichtelijker omdat je de gebruikte tabellen bij elkaar hebt.
En dat je de relaties allemaal bij elkaar hebt.
Ga eens een zeer uitgebreide query met bijvoorbeeld 30 joins maken. Voeg er ook nog eens een fikse doos echte(!) filters aan toe. Krijg je een enorme hoeveelheid AND statements, waar je gewoon helemaal stil van wordt. En zie de echte filters nog maar eens terug te vinden. En welke filter hoorde nou ook al weer bij welke join?
Dat wordt echt een enorme puinhoop en het is dus ook nauwelijks meer leesbaar.
Goed je query opschrijven...
Moet je ook als je het lardeert met allerlei left/right/inner/natural/etc joins.
En ook wel handig als je OUTER en CROSS JOINS op dezelfde manier kunt tonen. Een beetje standaardisatie is ook wel goed voor de leesbaarheid.
cross join is toch zo'n ding met een = :?
Oracle had ook een standaard manier om outer en cross joins op te schrijven namelijk de *= (left join) =* (right join) en voor de cross join de =

Sybase en mssql kennen die operator ook nog geloof ik.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
ACM schreef op 25 september 2002 @ 19:03:
Oracle kende de outer join (expliciet dan, dmv *= en =* wel) niet eens in voorgaande versies.
Maar verder is het overzichtelijker omdat je de gebruikte tabellen bij elkaar hebt.
En dat je de relaties allemaal bij elkaar hebt.
Misschien persoonlijke smaak, maar ik vind het dus handiger om als ik een extra join toevoeg, gelijk maar even aan te geven wat zijn join criteria zijn. Dan vergeet je er ook niet zo snel eentje.
Goed je query opschrijven...
Moet je ook als je het lardeert met allerlei left/right/inner/natural/etc joins.
[...]

[...]
Een cross join werkt ongeveer zo:
code:
1
select a.id, b.id from a, b


Of MSSQL de operators *= en =* kennen. Nooit tegengekomen in Books Online in ieder geval, maar ga ik even proberen.

Even geprobeerd en je hebt nog gelijk ook. Weer wat geleerd.
Maar eens kijken of ik kan achterhalen of MS dat wil blijven ondersteunen. Kan handig zijn om dat soort query een beetje meer db onafhankelijk te maken.

Never underestimate the power of


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

cameodski schreef op 25 september 2002 @ 19:20:
Een cross join werkt ongeveer zo:
code:
1
select a.id, b.id from a, b
Ow dat, waar gebruik je dat voor trouwens? :)
Of MSSQL de operators *= en =* kennen. Nooit tegengekomen in Books Online in ieder geval, maar ga ik even proberen.

Even geprobeerd en je hebt nog gelijk ook. Weer wat geleerd.
Maar eens kijken of ik kan achterhalen of MS dat wil blijven ondersteunen. Kan handig zijn om dat soort query een beetje meer db onafhankelijk te maken.

Ik meende dat Otis me dat ooit vertelde ergens, maar dat zou ik niet meer zeker weten :)
Anyway, ondertussen ondersteund Oracle 9i wel de left/right [outer] join syntax en MSSQL en Sybase doen dat vast al langer.
Dus je hoeft daarvoor niet je queries aan te passen lijkt me :)

Verwijderd

ACM schreef op 25 september 2002 @ 19:03:

[...]

Left en right joins zijn dan over het algemeen ook outer joins :)
Oja, ik haal die rommel door de war omdat ik Oracle gewend ben :)


[q.]
Oracle kende de outer join (expliciet dan, dmv *= en =* wel) niet eens in voorgaande versies.
Maar verder is het overzichtelijker omdat je de gebruikte tabellen bij elkaar hebt.
En dat je de relaties allemaal bij elkaar hebt.[/q]

"WHERE tabel1=tabel2(+)" wordt het dan

Where is superoverzichtelijk te maken, ligt er gewoon aan hoe netjes jij je query maakt. Ik doe altijd eerst de joins en dan de voorwaarden.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Owja, de *= en =* waren dan van Sybase en MSSQL en de tabel1.ding = tabel2.ding(+) was van Oracle :)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
ACM schreef op 25 september 2002 @ 19:34:
Ow dat, waar gebruik je dat voor trouwens? :)
Vaak zat. :)
Bijvoorbeeld voor tabellen met allerlei instellingen, waarin maar één record zit.
Anyway, ondertussen ondersteund Oracle 9i wel de left/right [outer] join syntax en MSSQL en Sybase doen dat vast al langer.
Dus je hoeft daarvoor niet je queries aan te passen lijkt me :)
Oh, gelukkig. :)
Ik wilde al gelijk alle queries die ik ooit geschreven heb, gaan aanpassen. ;)

Never underestimate the power of


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

dusty

Celebrate Life!

Verwijderd schreef op 25 september 2002 @ 19:41:
[...]
Where is superoverzichtelijk te maken, ligt er gewoon aan hoe netjes jij je query maakt. Ik doe altijd eerst de joins en dan de voorwaarden.

Dat is leuk als de volledige indexing en optimizing van Oracle zelf aanstaat, echter is dat bij bedrijven toch stiekum niet echt vaak het geval, waardoor dus je queries een stukken langer gaat duren dan noodzakelijk. ( zie: Explain )

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


Verwijderd

Het gebruik van wel dan niet gebruiken van JOIN maakt in principe niet zoveel uit.

Ikzelf gebruik het liefst gebruik van T-SQL (dus zonder LEFT JOIN en dergelijke) , maar dat is slechts een kwestie van de wijze waarop ik er door de jaren gewend aan ben geraakt. Ik kan me levendig voorstellen dat er anderen zijn die liever gebruik maken van het keyword JOIN.

Verwijderd

Vergat er nog even bij te melden dat op mijn school ook op gebruik van JOIN operator werd gehamerd, maar goed, door de jaren heen ben ik gewend geraakt aan het gebruik van T-SQL (Sybase in mijn geval)

*= en =* stammen naar mijn weten uit Sybase. Vroegere versies van MSSQL zijn gebaseerd op Sybase en waarschijnlijk is dat de reden, waarom dit is overgenomen. Ze worden inderdaad gebruik voor outer joins.

Verwijderd

Verwijderd schreef op 25 september 2002 @ 17:01:
[...]


Ja dat klopt. In mijn ogen ook de enige nuttige join-vorm..


[...]


Op de UvT (KUB) gelukkig niet! Alles met WHERE :*)
Ja gek he?! Op de UVT wordt met Oracle 8 gewerkt! Dat ondersteund helemaal geen JOINS. Heb jij niet opgelet bij Sergei z'n pratica??
Pagina: 1