|
Categorieën >
PHP & SQL
Recursief data ophalen uit 3 tabellen (Opgelost)
|
|
|
offline
|
 
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
Rik – 03/01/2010 16:28
|
|
offline
|
 
Crew algemeen
|
Volgens mij kun je zoiets doen: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]
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.
|
|
|
|
offline
|
 
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.
<?php
private function collectAll() {
$items = array();
$res = query("
SELECT
regions.title,
users.name,
users.address,
users.zipcode,
users.region,
users.city,
users.phone,
users.url,
users.email,
users.open_mon,
users.open_tue,
users.open_wed,
users.open_thu,
users.open_fri,
users.open_sat,
users.open_sun,
users.info,
user_images.filename_small,
user_images.filename_full,
regions.id AS kRegion,
users.id AS kUser,
user_images.id AS kImage
FROM
regions
LEFT JOIN users ON users.region = regions.id
LEFT JOIN user_images ON user_images.user_id = users.id
ORDER BY
regions.id ASC,
users.name ASC,
user_images.id ASC
");
if(num_rows($res)) {
while($r = fetch_assoc($res)) {
$items[$r['kRegion']]['title'] = $r['title'];
if($r['kUser'] != '') {
$items[$r['kRegion']][$r['kUser']]['name'] = ($r['name'] == '' ? 'Naamloos' : $r['name']);
$items[$r['kRegion']][$r['kUser']]['address'] = $r['address'];
$items[$r['kRegion']][$r['kUser']]['zipcode'] = $r['zipcode'];
$items[$r['kRegion']][$r['kUser']]['region'] = $r['region'];
$items[$r['kRegion']][$r['kUser']]['city'] = $r['city'];
$items[$r['kRegion']][$r['kUser']]['phone'] = $r['phone'];
$items[$r['kRegion']][$r['kUser']]['url'] = $r['url'];
$items[$r['kRegion']][$r['kUser']]['email'] = $r['email'];
$items[$r['kRegion']][$r['kUser']]['open_mon'] = $r['open_mon'];
$items[$r['kRegion']][$r['kUser']]['open_tue'] = $r['open_tue'];
$items[$r['kRegion']][$r['kUser']]['open_wed'] = $r['open_wed'];
$items[$r['kRegion']][$r['kUser']]['open_thu'] = $r['open_thu'];
$items[$r['kRegion']][$r['kUser']]['open_fri'] = $r['open_fri'];
$items[$r['kRegion']][$r['kUser']]['open_sat'] = $r['open_sat'];
$items[$r['kRegion']][$r['kUser']]['open_sun'] = $r['open_sun'];
$items[$r['kRegion']][$r['kUser']]['info'] = $r['info'];
if($r['kImage'] != '') {
$items[$r['kRegion']][$r['kUser']][$r['kImage']]['filename_small'] = $r['filename_small'];
$items[$r['kRegion']][$r['kUser']][$r['kImage']]['filename_full'] = $r['filename_full'];
}
}
}
}
$this->items = $items;
}
?>
<?php private function collectAll() { $res = query(" SELECT regions.title, users.name, users.address, users.zipcode, users.region, users.city, users.phone, users.url, users.email, users.open_mon, users.open_tue, users.open_wed, users.open_thu, users.open_fri, users.open_sat, users.open_sun, users.info, user_images.filename_small, user_images.filename_full, regions.id AS kRegion, users.id AS kUser, user_images.id AS kImage FROM regions LEFT JOIN users ON users.region = regions.id LEFT JOIN user_images ON user_images.user_id = users.id ORDER BY regions.id ASC, users.name ASC, user_images.id ASC "); if(num_rows($res)) { while($r = fetch_assoc($res)) { $items[$r['kRegion']]['title'] = $r['title']; if($r['kUser'] != '') { $items[$r['kRegion']][$r['kUser']]['name'] = ($r['name'] == '' ? 'Naamloos' : $r['name']); $items[$r['kRegion']][$r['kUser']]['address'] = $r['address']; $items[$r['kRegion']][$r['kUser']]['zipcode'] = $r['zipcode']; $items[$r['kRegion']][$r['kUser']]['region'] = $r['region']; $items[$r['kRegion']][$r['kUser']]['city'] = $r['city']; $items[$r['kRegion']][$r['kUser']]['phone'] = $r['phone']; $items[$r['kRegion']][$r['kUser']]['url'] = $r['url']; $items[$r['kRegion']][$r['kUser']]['email'] = $r['email']; $items[$r['kRegion']][$r['kUser']]['open_mon'] = $r['open_mon']; $items[$r['kRegion']][$r['kUser']]['open_tue'] = $r['open_tue']; $items[$r['kRegion']][$r['kUser']]['open_wed'] = $r['open_wed']; $items[$r['kRegion']][$r['kUser']]['open_thu'] = $r['open_thu']; $items[$r['kRegion']][$r['kUser']]['open_fri'] = $r['open_fri']; $items[$r['kRegion']][$r['kUser']]['open_sat'] = $r['open_sat']; $items[$r['kRegion']][$r['kUser']]['open_sun'] = $r['open_sun']; $items[$r['kRegion']][$r['kUser']]['info'] = $r['info']; if($r['kImage'] != '') { $items[$r['kRegion']][$r['kUser']][$r['kImage']]['filename_small'] = $r['filename_small']; $items[$r['kRegion']][$r['kUser']][$r['kImage']]['filename_full'] = $r['filename_full']; } } } } $this->items = $items; } ?>
Uitlezen doe ik als volgt (maar dan natuurlijk mooi in de templateparser):
<?php
foreach($this->items as $regions) {
print $regions['title'].'<br />';
foreach($regions as $users) {
if(is_array($users)) {
print '> '.$users['name'].'<br />';
foreach($users as $images) {
if(is_array($images)) {
print '>> '.$images['filename_small'].'<br />';
}
}
}
}
}
?>
<?php foreach($this->items as $regions) { print $regions['title'].'<br />'; foreach($regions as $users) { print '> '.$users['name'].'<br />'; foreach($users as $images) { print '>> '.$images['filename_small'].'<br />'; } } } } } ?>
Nog op- of aanmerkingen ?[/code]
|
Dit onderwerp is gesloten.
|
|
|