Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySql] Union parent/child relaties

Pagina: 1
Acties:

  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 14-11 09:29
Ik wil een row selecteren, met daaraan gerelateerde rows. Dit kan natuurlijk met twee losse queries:

code:
1
SELECT * FROM dingen WHERE name='henk';

en
code:
1
SELECT * FROM dingen WHERE parent=$result['id'];


Ik ben nu al een tijdje aan het aankloten en volgens mij moet dit met UNION. Ik kan wel meerdere rows selecteren, alleen de relatie tussen de 2 rows leggen lukt me niet. Dit is dus wat ik ongeveer wil:

code:
1
2
3
SELECT * FROM dingen AS p WHERE name='henk';
UNION
SELECT * FROM dingen AS c WHERE c.parent=p.id;


Het bericht is hier echter #1054 - Unknown column 'p.id' in 'where clause'

Wat doe ik hier verkeerd? of hoe kan ik dit het beste aanpakken? In de mysql manual vind ik niet veel meer dan dit (of ik weet niet waar ik moet zoeken)

[ Voor 1% gewijzigd door DiLDoG op 31-08-2007 10:40 . Reden: voorbeelden beetje aangepast ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je moet geen union hebben maar een join ;)

[ Voor 47% gewijzigd door RobIII op 31-08-2007 02:22 ]

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


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Wat dacht je van gewoon tweemaal het ID in de query opnemen?
code:
1
2
3
SELECT * FROM dingen AS p WHERE id=10;
UNION
SELECT * FROM dingen AS c WHERE c.parent=10;


Waarom doen programmeurs dingen altijd via de moeilijke weg?

If it isn't broken, fix it until it is..


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je hebt wel gelijk, maar ik vermoed dat de TS eigenlijk rijen wilt met informatie van zowel parent als child. En dat kan dus met een eenvoudige join. :)

{signature}


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Niemand_Anders schreef op vrijdag 31 augustus 2007 @ 08:33:
Wat dacht je van gewoon tweemaal het ID in de query opnemen?
code:
1
2
3
SELECT * FROM dingen AS p WHERE id=10;
UNION
SELECT * FROM dingen AS c WHERE c.parent=10;


Waarom doen programmeurs dingen altijd via de moeilijke weg?
Misschien omdat het bovenstaande alleen een stukje voorbeeld code is en de echte query misschien wel 200 regels is??? Waardoor jouw ideetje opeens niet meer gaat werken...

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nee, p.id was al gelijk gesteld aan 10, dus je kan gewoon c.parent = 10 doen hoor, zelfs al zou een heel stuk query weggelaten zijn.

{signature}


  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 14-11 09:29
Voutloos schreef op vrijdag 31 augustus 2007 @ 09:39:
Nee, p.id was al gelijk gesteld aan 10, dus je kan gewoon c.parent = 10 doen hoor, zelfs al zou een heel stuk query weggelaten zijn.
Ok sorry misschien was ik niet helemaal duidelijk, dat id was slechts als voorbeeld. in praktijk zijn ze door andere fields gelinkt.

en RobIII: met join krijg je toch 1 row terug met gecombineerde data? Ik heb dit nodig
row-10
kind-23
kind-24
kind-25
kind-26

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DiLDoG schreef op vrijdag 31 augustus 2007 @ 10:38:

en RobIII: met join krijg je toch 1 row terug met gecombineerde data?
Euh...nee :? Heb je wel link die ik postte wel gevolgd en gelezen?

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


  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 14-11 09:29
Ja ik snap wel wat een join doet, maar ik wil de resultaten als losse rows

dus

p.id, p.name
c.id, c.name
c.id, c.name
c.id, c.name

niet

p.id, p.name, c.id, c.name
p.id, p.name, c.id, c.name

Volgens mij doe je het eerste met een union, het tweede met een join :?

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
DiLDoG schreef op vrijdag 31 augustus 2007 @ 01:10:
Ik wil een row selecteren, met daaraan gerelateerde rows. Dit kan natuurlijk met twee losse queries:

code:
1
SELECT * FROM dingen WHERE name='henk';

en
code:
1
SELECT * FROM dingen WHERE parent=$result['id'];


Ik ben nu al een tijdje aan het aankloten en volgens mij moet dit met UNION. Ik kan wel meerdere rows selecteren, alleen de relatie tussen de 2 rows leggen lukt me niet. Dit is dus wat ik ongeveer wil:

code:
1
2
3
SELECT * FROM dingen AS p WHERE name='henk';
UNION
SELECT * FROM dingen AS c WHERE c.parent=p.id;


Het bericht is hier echter #1054 - Unknown column 'p.id' in 'where clause'

Wat doe ik hier verkeerd? of hoe kan ik dit het beste aanpakken? In de mysql manual vind ik niet veel meer dan dit (of ik weet niet waar ik moet zoeken)
je moet bij een UNION de queries als losse queries zien... en dan is bij de tweede select p.id niet bekend... je zult dus bijvoorbeeld in het tweede deel alsnog een join moeten doen, om alle children te krijgen...
sowieso moet er na de eerste select trouwens geen ";"
code:
1
2
3
select * from dingen as p where p.name = 'henk'
union
select p.* from dingen as c left join dingen as p on c.parentid = p.id where c.name = 'henk'


heb dit zonder nadenken getypt verder, dus copy-pasten gaat waarschijnlijk niet helpen (en dat is maar goed ook natuurlijk ;))

overigens moet je niet vergeten rekening te houden met je sortering zodat het eerste deel van je union altijd bovenaan staat... maar dat is een nieuwe uitdaging voor je wellicht :D

[ Voor 5% gewijzigd door P.O. Box op 31-08-2007 14:23 ]


  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 14-11 09:29
Hm ok. Ik had gehoop dat je unions enigzins kon verbinden. Joinen is waarschijnlijk nog inefficienter. dus ik denk dat 2 losse queries in dit geval toch beter zijn. :/

Toch bedankt voor alle reacties.

  • fraaije
  • Registratie: Februari 2004
  • Laatst online: 29-11 16:28
DiLDoG schreef op vrijdag 31 augustus 2007 @ 14:44:
Hm ok. Ik had gehoop dat je unions enigzins kon verbinden. Joinen is waarschijnlijk nog inefficienter. dus ik denk dat 2 losse queries in dit geval toch beter zijn. :/

Toch bedankt voor alle reacties.
Ik denk dat je daar raar van op zal kijken. Als je indexen goed zijn weet ik bijna wel zeker dat een JOIN op dezelfde tabel sneller is dan een 2 losse query's. Vooral als je een aparte DB server hebt.

Probeer ze allebei maar eens en kijk welke sneller zijn :)
Pagina: 1