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

[PervasiveSQL] 2 joins in 1 query?

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

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 29-11 17:34
We hebben de volgende tabellen, met de velden die erin staan

enkelvoudig(antwoord_id, product_id)
producten(product_id, product_omschrijving, artikelnummer)
antwoorden(antwoord_id, type_id, vraag_id, antwoord_text_id)
antwoord_text(antwoord_text_id, text)
vragen(vraag_id, vraagstelling)

Nu wil ik graag een overzicht maken van alle vraagstelling, met de antwoorden die daarbij mogelijk zijn en daarnaast welk artikelnummer dit dan oplevert. Dit alles van een van tevoren gekozen type. Dit doe ik met de volgende query:

PHP:
1
2
3
4
5
6
$sql = "SELECT v.vraagstelling, t.text, p.artikelnummer FROM enkelvoudig e, vragen v, antwoord_text t, antwoorden a, producten p ".
        "WHERE e.antwoord_id = a.antwoord_id ".
        "AND e.product_id = p.product_id ".
        "AND a.vraag_id = v.vraag_id ".
        "AND a.antwoord_text_id = t.antwoord_text_id ".
        "AND a.type_id = '$type_id'";


Voor zover ik kan zien gaat dit goed (er staat nog geen data in enkelvoudig, maar dit levert dan ook geen resultaten op).

Echter ik zou graag willen dat wanneer als er geen of slechts een deel van de antwoord_id's in enkelvoudig staan, behorende bij het type_id, de overige gevuld worden met blanco velde. Zoals een LEFT of RIGHT join zou opleveren.

Kan iemand van jullie mij in de goede richting sturen?

Zelf zat ik al te denken om 2 joins te doen, maar ik heb eigenlijk nog nooit echt met joins gewerkt. De enige join die ik altijd gehanteerd heb, is zoals nu ook in de query staat, de inner join, maar dan in bovenstaande notatie. Ik ken het principe van de LEFT, RIGHT en OUTER join, maar kom desondanks niet echt verder nu.

[Edit]
Na nog een tijdje door te proberen kom ik nu op de volgende query uit:
SQL:
1
2
3
4
5
SELECT v.vraagstelling, t.text, s.antwoord_id, s.product_id, p.artikelnummer
FROM ((simpel s RIGHT JOIN antwoorden a ON s.antwoord_id = a.antwoord_id) LEFT JOIN producten p ON s.product_id = p.product_id), vragen v, antwoord_text t
WHERE a.vraag_id = v.vraag_id
AND a.antwoord_text_id = t.antwoord_text_id
ORDER BY a.antwoord_id


Dit geeft tot nu toe het gewilde resultaat, maar ik vraag me wel nog af of dit ook de juiste manier is van join gebruik.

[ Voor 25% gewijzigd door Crazybyte op 13-08-2007 15:17 ]


  • remco_k
  • Registratie: April 2002
  • Laatst online: 08:28

remco_k

een cassettebandje was genoeg

Crazybyte schreef op maandag 13 augustus 2007 @ 14:41:
[Edit]
Na nog een tijdje door te proberen kom ik nu op de volgende query uit:
SQL:
1
2
3
4
5
SELECT v.vraagstelling, t.text, s.antwoord_id, s.product_id, p.artikelnummer
FROM ((simpel s RIGHT JOIN antwoorden a ON s.antwoord_id = a.antwoord_id) LEFT JOIN producten p ON s.product_id = p.product_id), vragen v, antwoord_text t
WHERE a.vraag_id = v.vraag_id
AND a.antwoord_text_id = t.antwoord_text_id
ORDER BY a.antwoord_id


Dit geeft tot nu toe het gewilde resultaat, maar ik vraag me wel nog af of dit ook de juiste manier is van join gebruik.
Je noteerd je queries wel erg onhandig. Komt de leesbaarheid niet ten goede.
Voorbeeldje hoe het beter staat, met zelfde functionaliteit (onder voorbehoud danwel):
SQL:
1
2
3
4
5
6
7
SELECT v.vraagstelling, t.text, s.antwoord_id, s.product_id, p.artikelnummer
FROM simpel s
RIGHT JOIN antwoorden a ON s.antwoord_id = a.antwoord_id
RIGHT JOIN vragen v ON a.vraag_id = v.vraag_id
RIGHT JOIN antwoord_text t ON a.antwoord_text_id = t.antwoord_text_id
LEFT JOIN producten p ON s.product_id = p.product_id
ORDER BY a.antwoord_id

Verder moet je de tabel 'enkelvoudig' met een LEFT OUTER JOIN meenemen en dan ben je weer een stap verder.

Edit: ORDER BY op een veld die niet in de SELECT ... FROM zit?

Alles kan stuk.