[MySQL] Controleren of product met attributen bestaat

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik ben bezig om een winkeltje te maken die met attributen werkt. Echter zit ik nu met een probleempje.

Ik heb een cartitemattributevalue tabel. Hier staat per product in welke attribuutwaarden het product heeft en bij welk cartitem deze hoort.


cartitemid productid attributevalueid
1220
1223
2220
2225
3221
3226



Als de tabel er als hierboven uitziet, dan heb ik 3 dezelfde producten in mijn mandje met verschillende attributen.

Echter als ik nu een product met bepaalde attribuutwaardenid's (bijv 20,23) aan mijn mandje toevoeg die al in het mandje bestaat moet ik controleren of het product al in het mandje zit met de bijbehorende attributen.

Hoe kan ik dit nu controleren? Ik heb al verschillende queries geprobeerd, maar geen enkele was succevol. Het probleem is is dat ik moet controleren of een product met een bepaald productid en bepaalde attributevalueid's al in de tabel bestaat. Als ik bijv doe:

SELECT cartitemid FROM cartitemattributevalueid WHERE productid=20 AND attributevalueid IN (20,23) doe, dan krijg ik ook de cartitemid's van bijv productid=20 en attributevalue= (20,25) terug en dat mag niet.

Is hier een simpele oplossing voor? Ik heb ook al gestoeid met ANY en ALL, maar dat ging ook niet werken.

[ Voor 17% gewijzigd door RSD op 03-09-2010 19:09 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nvm. Ik kon heeg hout snijden van je topic... :X Kwartje is nu gevallen...

[ Voor 92% gewijzigd door RobIII op 03-09-2010 19:20 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    cartitemid
FROM
    cartitemattributevalueid
WHERE
    productid = 2
AND
    attributevalueid IN(20,23)
GROUP BY
    cartitemid
HAVING
    COUNT(*) = 2;

[ Voor 6% gewijzigd door cariolive23 op 03-09-2010 19:28 ]


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
En als het aantal attribuutwaarden variabel is per product dus de waarde van de count kan variëren? Dan werkt deze oplossing niet volgens mij.

Oh nee, die count kan ik uitrekenen. Waarschijnlijk is dit dan inderdaad de oplossing.

[ Voor 24% gewijzigd door RSD op 03-09-2010 19:44 ]


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
De COUNT moet gelijk zijn aan het aantal variabelen in de IN().

Acties:
  • 0 Henk 'm!

  • mhaket
  • Registratie: Augustus 2006
  • Laatst online: 08-09 15:48
Je kan ook een INSERT ... ON DUPLICATE KEY IGNORE gebruiken. Als je key's goed staan wordt er geen duplicaat record toegevoegt.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Jah maar de inserts zijn over meerdere tabellen en de hoeveelheid moet bij bestaan opgehoogd worden. Waarschijnlijk kan het wel met die inserts, maar ik weet niet of dat zo netjes is?

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Zorg eerst maar voor UNIQUE constraints, dan kunnen er geen dubbele records worden aangemaakt. Een INSERT heeft altijd betrekking op één tabel, nooit meerdere, dat kan niet. Wat je bedoelt met "en de hoeveelheid moet bij bestaan opgehoogd worden" is mij niet duidelijk, maar het doet mij denken aan een trigger.

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Een unique constraint gaat hier niet werken, want een enkele attributevalue mag wel meerdere keren voorkomen, er mogen alleen geen producten toegevoegd worden waarvoor alle attributevalues overeenkomen.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Nou als het product al in het winkelmandje zit en er wordt er één bij toegevoegd, dan moet de hoeveelheid opgehoogd worden, in plaats van dat het product opnieuw wordt toegevoegd als cartitem.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
_js_ schreef op vrijdag 03 september 2010 @ 21:10:
Een unique constraint gaat hier niet werken, want een enkele attributevalue mag wel meerdere keren voorkomen, er mogen alleen geen producten toegevoegd worden waarvoor alle attributevalues overeenkomen.
Dat kun je oplossen met een check constraint, zie de handleiding van jouw database.

Ps. MySQL ondersteunt dit niet, al kun je wellicht e.e.a. nabouwen met een trigger.
Pagina: 1