hej! Hej! Hej! Ok. Missade det.datastruktur och sqlfråga
jag har ett system (mysql) där en produkt kan ha flera varianter. Varianter baseras på attribut som t.ex. storlek och färg och därför har jag en tabell som länkar attribut till en viss produkt (productattributelink) och som används i admingränssnittet för att när en ny variant av en produkt skapas säga till användaren att välja t.ex. vilken färg en viss variant har.
Attributen har alternativ som t.ex. small, medium, grön blå och för att länka vilka alternativ som gäller för en viss variant har jag en länktabell variantattributevalue som länkar ihop en variant till de attribut som ska finnas och attributens värden.
Första frågan: Är denna struktur lämplig?
product
--------
productguid
name
variant
--------
productguid
variantguid
name
productattributelink
----------------------
productguid
attributeid (t.ex. färg)
variantattributevalue
-----------------------
variantguid
attributeid (t.ex. färg)
attributealternativeid (t.ex. grön)
attribute
---------
attributeid
name (t.ex. färg, storlek)
attributealternative
-------------------
attributealternativeid
attributeid
name (t.ex. small, medium)
Andra frågan: Jag vill genom sökning hämta ut en lista över varianter med de attribut och attributens värden som är inlagda för en viss produkt, alltså något i stil med:
SELECT cart.ShoppingcartGuid, cart.ProductGuid, cart.VariantGuid, cart.Quantity, cart.DateAdded, p.NameDefault, p.Sellout, v.ArticleNo, t.TaxPercentage, v.Price, v.PriceRecommended, v.PriceSellout, (SELECT GROUP_CONCAT(a.NameDefault, ': ',aa.NameDefault, '<br/>' SEPARATOR '') FROM VariantAttributeValue vav JOIN Attribute a ON a.AttributeId = vav.AttributeId JOIN AttributeAlternative aa ON aa.AttributeAlternativeId = vav.AttributeAlternativeId WHERE vav.VariantGuid = cart.VariantGuid) AS VariantAttributesAndValues FROM ShoppingcartItem cart JOIN Product p ON p.ProductGuid = cart.ProductGuid JOIN Variant v ON v.VariantGuid = cart.VariantGuid JOIN Tax t ON t.TaxId = v.TaxId WHERE cart.ShoppingcartGuid=pShoppingcartGuid ORDER BY p.NameDefault;
Där den inre select satsen kör en group_concat.
MEN! i de fall man lagt in att en produkt ska ha attributen färg och storlek men endast attributet färg har ett värde så kommer inte storlek att synas i denna hämtning, jag vill att båda attributen ska synas men i de fall då ett visst attribut inte har ett värde vill jag ändå att det ska synas fast med texten not selected...
Situationen uppstår normalt inte eftersom det är ett felaktigt "state", men det kan hända om man t.ex. väljer att lägga till ett attribut till en produkt som redan finns utan att uppdatera produktens varianter...
Kanske ett lyxproblem....
/mvh stefanSv: datastruktur och sqlfråga
Strukturen ser vettig ut. Eftersom attributalternativ har en länk till attribut kanske du inte behöver ha en länk från variantattributevale till attributeid tycker jag, men jag kan miss nått. Om du vill kunna ha attributet satt ,men attributealtenative null. Jag antar att det är det som är problemet i fråga två.
Jag tycker att problemet borde lösas, om jag förstår problemet rätt, med att byta ut joinen till AttributeAlternative mot en "left outer join". Då får du ett en rad även om inte AttributeAlternativ är satt.
/SvalanSv:datastruktur och sqlfråga
Tack för responsen.
Den länken behövs inte egentligen. Sant. Men den gör att jag inte behöver joina attributealternativeid tabellen för att få reda på attributeid... så skulle gå att ta bort men den är bekväm :)
Left outer join skulle funka om det fanns en post i variantattributevalue tabellen men så är inte fallet om just det attributet inte är valt för en viss variant...
/stefanSv: datastruktur och sqlfråga
Då får du basera den innere frågan på datan i Attribute och AttributeAlternativ istället,
och se VariantAttributeValue något som du joinar in om det finns.
Så, om jag förstår strukturen rätt så får du länka in denna ordningen:
From productattributelink
JOIN Attribute
JOIN AttributeAlternative
Left outer join VariantAttributeValue
Då borde du allt få med alla attribut, men få null om VariantAttributeValue saknas.
/Svalan