login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Recursief data ophalen uit 3 tabellen (Opgelost)

Offline ikki007 - 03/01/2010 15:23
Avatar van ikki007Gouden medailleGouden medaille

PHP ver gevorderde
Hey,


Mijn database is als volgt opgebouwd:

- Regio's
- Bedrijven
- Afbeeldingen

Deze zijn in deze volgorde ook met elkaar verbonden mbv id's, een regio heeft een x aantal bedrijven en een bedrijf heeft een x aantal afbeeldingen.
Dat is allemaal niet zo moeilijk. Maar nu wil ik het éigenlijk zo ophalen dat ik een array krijg die als volgt is opgebouwd:

Array[(regio_id)] { Array[(bedrijf_id)] { Array[(afbeelding_id)] { } } }

Alleen dan meer regio's, meer bedrijven en meer afbeeldingen natuurlijk.
Ik denk dat dit niet binnen 1 query kan, maar ik vraag mij af of ik nou echt eerst alle regio's moet ophalen, dan een query om alle bedrijven op te halen en dan alsnog een query om alle afbeeldingen op te halen.

Is er iemand die mij uit de brand kan helpen hoe dit op de beste manier gaat?

Het gaat erom dat ik alle regio's wil uitlezen, en dan per regio de bedrijven, en per bedrijf de afbeeldingen.


Mvg,
ikki

5 antwoorden

Gesponsorde links
Offline Rik - 03/01/2010 16:28
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Volgens mij kun je zoiets doen:
  1. SELECT regios.regio_id, bedrijven.bedrijf_id, afbeeldingen.afbeelding_id FROM regios LEFT JOIN bedrijven ON [bedrijven aan regios koppelen] LEFT JOIN afbeeldingen [afbeeldingen aan bedrijven koppelen]
Dan zal je zoiets krijgen:
regio1,bedrijf1,afbeelding1
regio1,bedrijf1,afbeelding2
regio2,bedrijf2,afbeelding3
regio3,bedrijf3,afbeelding4
regio3,bedrijf3,afbeelding5
regio3,bedrijf4,afbeelding6

Als je dat resultaat slim afgaat met een while kun je het in het gewenste formaat krijgen.
Bedankt door: ikki007
Offline ikki007 - 03/01/2010 17:32
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Ik wist niet zeker of het met Joins kon, wel dus.
Het koste wel aardig wat aanpassingen in de while() lus, het is als volgt geworden.
Best lelijk die grote lappen, maar kan me niet bedenken hoe het handiger/mooier kan.

  1. <?php
  2. private function collectAll() {
  3. $items = array();
  4.  
  5. $res = query("
  6.  
  7. SELECT
  8. regions.title,
  9. users.name,
  10. users.address,
  11. users.zipcode,
  12. users.region,
  13. users.city,
  14. users.phone,
  15. users.url,
  16. users.email,
  17. users.open_mon,
  18. users.open_tue,
  19. users.open_wed,
  20. users.open_thu,
  21. users.open_fri,
  22. users.open_sat,
  23. users.open_sun,
  24. users.info,
  25. user_images.filename_small,
  26. user_images.filename_full,
  27. regions.id AS kRegion,
  28. users.id AS kUser,
  29. user_images.id AS kImage
  30. FROM
  31. regions
  32. LEFT JOIN users ON users.region = regions.id
  33. LEFT JOIN user_images ON user_images.user_id = users.id
  34. ORDER BY
  35. regions.id ASC,
  36. users.name ASC,
  37. user_images.id ASC
  38.  
  39. ");
  40.  
  41. if(num_rows($res)) {
  42. while($r = fetch_assoc($res)) {
  43. $items[$r['kRegion']]['title'] = $r['title'];
  44.  
  45. if($r['kUser'] != '') {
  46. $items[$r['kRegion']][$r['kUser']]['name'] = ($r['name'] == '' ? 'Naamloos' : $r['name']);
  47. $items[$r['kRegion']][$r['kUser']]['address'] = $r['address'];
  48. $items[$r['kRegion']][$r['kUser']]['zipcode'] = $r['zipcode'];
  49. $items[$r['kRegion']][$r['kUser']]['region'] = $r['region'];
  50. $items[$r['kRegion']][$r['kUser']]['city'] = $r['city'];
  51. $items[$r['kRegion']][$r['kUser']]['phone'] = $r['phone'];
  52. $items[$r['kRegion']][$r['kUser']]['url'] = $r['url'];
  53. $items[$r['kRegion']][$r['kUser']]['email'] = $r['email'];
  54. $items[$r['kRegion']][$r['kUser']]['open_mon'] = $r['open_mon'];
  55. $items[$r['kRegion']][$r['kUser']]['open_tue'] = $r['open_tue'];
  56. $items[$r['kRegion']][$r['kUser']]['open_wed'] = $r['open_wed'];
  57. $items[$r['kRegion']][$r['kUser']]['open_thu'] = $r['open_thu'];
  58. $items[$r['kRegion']][$r['kUser']]['open_fri'] = $r['open_fri'];
  59. $items[$r['kRegion']][$r['kUser']]['open_sat'] = $r['open_sat'];
  60. $items[$r['kRegion']][$r['kUser']]['open_sun'] = $r['open_sun'];
  61. $items[$r['kRegion']][$r['kUser']]['info'] = $r['info'];
  62.  
  63. if($r['kImage'] != '') {
  64. $items[$r['kRegion']][$r['kUser']][$r['kImage']]['filename_small'] = $r['filename_small'];
  65. $items[$r['kRegion']][$r['kUser']][$r['kImage']]['filename_full'] = $r['filename_full'];
  66. }
  67. }
  68. }
  69. }
  70.  
  71. $this->items = $items;
  72. }
  73. ?>


Uitlezen doe ik als volgt (maar dan natuurlijk mooi in de templateparser):

  1. <?php
  2. foreach($this->items as $regions) {
  3. print $regions['title'].'<br />';
  4.  
  5. foreach($regions as $users) {
  6. if(is_array($users)) {
  7. print '> '.$users['name'].'<br />';
  8.  
  9. foreach($users as $images) {
  10. if(is_array($images)) {
  11. print '>> '.$images['filename_small'].'<br />';
  12. }
  13. }
  14. }
  15. }
  16. }
  17. ?>


Nog op- of aanmerkingen ?[/code]
Offline Rik - 03/01/2010 19:06 (laatste wijziging 03/01/2010 19:27)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Volgens mij kan het niet echt korter dan dit. Het is op deze manier ongetwijfeld sneller dan dat je geneste queries gaat uitvoeren. Alleen is het wel zonde dat je heel vaak dezelfde regio en user zult ophalen (dat is bij genest niet nodig), maar ik denk echt dat dit de beste methode is.

Edit:
niet korter
Offline ikki007 - 03/01/2010 19:10
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Je bedoelt "niet echt korter dan dit" neem ik aan?  
Offline Rik - 03/01/2010 19:26
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Uh, ja, foutje.   
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.246s