Query voor 3 tafels?
1. site_widgets (widget_id, widget_name)
2. widget_content (content_id, widget_id, heading, content) Relatie site_widgets.widget_id => widget_content => widget_id
3. widget_photos (photo_id, rel_id, photo) Relatie: widget_content.content_id => widget_photos.rel_id
Ik ben nu bezig met het CMS gedeelte voor deze sectie. Het probleem dat ik ervaar is dat, alhoewel de meeste widgets gewoon een rij in alle drie de tafels hebben, er twee widgets zijn die 3 rijen hebben in de widget_content en widget_photos tafels. Voorbeeld:
Tafel site_widgets:
widget_id 1 | widget_name Opening dates
Tafel widget_content:
content_id 1 | widget_id 1 | heading Spring season etc etc
content_id 2 | widget_id 1 | heading Summer season etc etc
content_id 3 | widget_id 1 | heading Spring season etc etc
Tafel widget_photos:
photo_id 1 | rel_id 1 | spring.jpg
photo_id 2 | rel_id 2 | summer.jpg
photo_id 3 | rel_id 3 | fall.jpg
Ik weet echter niet hoe de query er uit moet zien zodat zowel de standaard widgets (een rij in de drie tafels als de afwijkende widgets zoals hierboven het juiste resultaat opleveren:
Ik heb het volgende geprobeerd
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public function get_widget_details($string)
{
$sql = "SELECT SW.widget_name
, SW.url_string
, WC.*
, WP.photo
FROM site_widgets SW
LEFT
JOIN widget_content WC
ON SW.widget_id = WC.widget_id
LEFT
JOIN widget_photos WP
ON WC.content_id = WP.rel_id
WHERE SW.url_string = ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array($string));
return $stmt->fetch();
}
{
$sql = "SELECT SW.widget_name
, SW.url_string
, WC.*
, WP.photo
FROM site_widgets SW
LEFT
JOIN widget_content WC
ON SW.widget_id = WC.widget_id
LEFT
JOIN widget_photos WP
ON WC.content_id = WP.rel_id
WHERE SW.url_string = ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(array($string));
return $stmt->fetch();
}
Ik heb het met een RIGHT JOIN geprobeerd maar krijg het niet voor elkaar
Ziet iemand wat ik fout doe? Alvast bedankt
Gewijzigd op 02/05/2018 23:09:50 door Donald Boers
Wat is het resultaat dat je verwacht en wat krijg je nu?
@Ben van Velzen Het probleem zit hem in de fetch en/of fetchAll. Voor de widgets met slechts 1 rij in elk van de drie tafels zou ik eigenlijk fetch moeten gebruiken. Doe ik dat echter dan krijg ik in de foreach loop voor de widgets met meerder rijen de Illegal string offset melding en andersom
Waarom dump je niet even op je scherm wat je als output krijgt? In je voorbeeld zul je overigens fetchall willen gebruiken gezien je meerdere records terug gaat krijgen.