[MySQL] 'Fake' Left join creëren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met het maken van een query voor een voorraad beheer systeem. Daarbij wil ik eerst een product kunnen pakken met alle bijhorende opties. Helaas heb ik zelf het systeem en database niet ontwikkeld waardoor er een aantal onhandige dingen in staan.

Ik zal even simpel proberen uit te leggen hoe de producten in de database staan opgeslagen:
Products: ProductID, ProductName
Groups: GroupID, GroupParentID, GroupName
Options: OptionID, OptionName, ProductID
GroupProduct: GroupID, ProductID

Even ter toelichting, in groups worden categorieën opgeslagen zoals Leer AB, Leer AC, daaronder komen kleuren te staan waarbij de GroupID van Leer AB als GroupParentID wordt gebruikt. In options staan eventuele extra opties die een klant zou kunnen hebben bij een product zoals een metalen poot bij een meubel. Het laatste lijkt mij duidelijk, dat is dus de koppeling van een groep en een product.

Wat ik nu wil doen is op basis van een Product ID het volgende tonen:
ProductID, ProductName, GroupID, GroupName, GroupID (KleurID), GroupName (KleurName), OptionID, OptionName

In geval van twee groups, vijf kleuren per groep zou dat dus 10 regels moeten opleveren. En dit gebeurt nu ook aan de hand van de volgende query die ik heb geschreven:

SQL:
1
2
3
4
5
6
SELECT g.GroupID, g.GroupName, k.GroupID AS KleurID, k.GroupName AS Kleur, gp.ProductID, gp.ProductNaam
FROM Groups AS k
LEFT JOIN Groups AS g ON g.GroupID = k.GroupParentID
LEFT JOIN GroupProduct AS gp ON gp.GroepID = k.GroupParentID
LEFT JOIN Products AS p ON p.ProductID = gp.ProductID
WHERE p.ProductID = 321


Dit werkt prima, alleen wil ik nu ook de meerprijs ermee toevoegen die opgeslagen staat in Options. Wat het probleem nu is, is dat een product ook geen meerprijs kan hebben. Op het moment dat ik een left join doe met meerprijs komt dat er dus een meerprijs bij te staan, maar dan zou ik graag ook nog een standaard versie willen tonen als OptionID NULL zal hebben. Ik weet dat ik dit via PHP kan doen, maar ik vroeg mij af of dit ook mogelijk is met SQL? Dan zou ik dus ipv 10 regels, 20 regels moeten krijgen waarbij alles wordt herhaal maar met een OptionID van NULL.

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 00:41

The Eagle

I wear my sunglasses at night

CASE statement toevoegen? :)
En waarom uberhaupt die left join? Kwam je er met een mormale join niet uit? Aangezien je als het ware bij je bovenste niveau begint zou een normale join met de juiste criteria ook moeten werken lijkt me :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In eerste instantie begon ik andersom te werken vandaar left join, maar je hebt inderdaad gelijk dat ik het inderdaad nu beter kan switchen aangezien het ook met join zou moeten werken.

Heb je een voorbeeld hoe het zou kunnen werken met een CASE statement?
SQL:
1
2
3
4
5
6
SELECT g.GroupID, g.GroupName, k.GroupID AS KleurID, k.GroupName AS Kleur, gp.ProductID, gp.ProductNaam, CASE WHEN o.OptionID < 1 THEN 0 ELSE o.OptionID END AS o.OptionID
FROM Groups AS k 
LEFT JOIN Groups AS g ON g.GroupID = k.GroupParentID 
LEFT JOIN GroupProduct AS gp ON gp.GroepID = k.GroupParentID 
LEFT JOIN Products AS p ON p.ProductID = gp.ProductID 
WHERE p.ProductID = 321


Dit werkt namelijk wel voor producten die geen optie hebben en zo 0 waarde krijgen toegekend, maar ik zou graag altijd 1 regel willen hebben met een 0 waarde.

Acties:
  • 0 Henk 'm!

  • svennd
  • Registratie: Februari 2013
  • Laatst online: 27-08 10:35
CASE gaat niet werken denk ik; IF en IFNULL kunnen wel hulp bieden :
select IFNULL(meerwaarde,0) as meerwaarde from ...

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Als je daadwerkelijk die 20 rijen in je resultaat wilt hebben dan wil je twee verschillende sets gegevens opvragen. Als je dat in 1 query wilt doen moet je een union gebruiken.
SELECT ... FROM Products
UNION ALL
SELECT ... FROM Products INNER JOIN Options ON ...

Maar het lijkt me dat dat niet nodig is, als je met een left join die options met meerprijs opvraagt dan kun je toch in php al gaan zeggen standaard kost product € x en er is een optie die kost € y extra (of als optie null is, dan laat je het tweede deel niet zien)

Je kunt niet met IF, IFNULL, CASE of wat dan ook van 1 rij 2 rijen maken. Alleen met joins kun je sets samenvoegen.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je kan extra join condities opgeven in de ON clause. :)

[ Voor 6% gewijzigd door Voutloos op 05-09-2013 11:39 ]

{signature}

Pagina: 1