[ALGO/SQL] variabele voorwaarde

Pagina: 1
Acties:

  • Matthis
  • Registratie: Juli 2004
  • Laatst online: 24-05 10:27
ik zit wat in de knoei met m'n offerte-systeem: ik heb een aantal winkels en producten. M'n bezoekers krijgen een formulier met alle producten te zien en moeten daar hun gewenste hoeveelheid invullen. Vervolgens moeten de prijzen opgehaald worden en de offerte per winkel gemaakt worden. Nu is het ophalen op zich wel geen probleem, maar bij het ophalen krijg ik een gesorteerde lijst van alle producten (per winkel). Echter, ook de winkels/prijzen die niet alle producten hebben worden in die lijst opgenomen. Momenteel doorloop ik dan de SQL-array en kijk of elke winkel alle producten heeft en behoud enkel de winkels die effectief alle producten hebben. Nu is dit nogal omslachtig en vroeg me af of er 1 van de Tweakers geen tips ofzo heeft...

Dit zijn m'n tabellen:
tabel producten
code:
1
2
3
4
5
6
7
8
+-----+---------------+
+  id +   naam        +
+-----+---------------+
+ 1   + product 1     +
+ 2   + product 2     +
+ 3   + product 3     +
+ 4   + product 4     +
+-----+---------------+



tabel winkels:
code:
1
2
3
4
5
6
7
+-----+---------------+
+  id +   naam        +
+-----+---------------+
+ 1   + winkel 1      +
+ 2   + winkel 2      +
+ 3   + winkel 3      +
+-----+---------------+


tabel prijzen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
+-----+---------------+---------------+----------------+
+ id  +   product     +    winkel     +  prijs         +
+-----+---------------+---------------+----------------+
+ 1   +  1            +  1            +   3            +
+ 2   +  1            +  2            +   2            +
+ 3   +  2            +  1            +   77           +
+ 4   +  2            +  2            +   66           +
+ 5   +  2            +  3            +   55           +
+ 6   +  3            +  1            +   3            +
+ 7   +  4            +  1            +   8            +
+ 8   +  4            +  2            +   6            +
+ 9   +  4            +  3            +   9            +
+-----+---------------+---------------+----------------+


m'n SQL is dit (pseudo-code hier):
code:
1
2
SELECT * from winkels, prijzen
WHERE   (prijzen.product = *alle gewenste producten dmv OR)


als de klant dan bv product 1 en 4 wil krijg ik een mooie lijst:
code:
1
2
3
4
5
6
7
8
9
+----------+----------+---------+
+ winkel   + product  + prijs   +
+----------+----------+---------+
+ 1        + 1        + 3       +
+ 2        + 1        + 2       +
+ 1        + 4        + 8       +
+ 2        + 4        + 6       +
+ 3        + 4        + 9       +
+----------+----------+---------+


ook winkel 3 krijgt hier resultaat, terwijl zij slechts 1 product kunnen leveren. Iemand enig idee hoe dit (dmv SQL of iets anders) aangepakt kan worden?
(het project wordt in PHP gemaakt)

alvast bedankt!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Als je sorteert op winkel, product, dan kun je ook in PHP kijken of alle producten die gezocht zijn erin voorkomen. Ik kan zo ff geen SQL bedenken die het kan (naja, geen MySQL, met een subquery kom ik er wel uit).

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:58
Welke SQL database gebruik je? MySQL (veel gebruikt in combinatie met PHP) ondersteunt geen set intersection (doorsnede van verzamelingen) en ook geen subqueries. Met die hulpmiddelen zou je namelijk per product de winkels kunnen vinden die dat product kunnen leveren en dan door middel van intersectie alleen de winkels die alle producten kunnen leveren beschouwen.

Overigens is het wel mogelijk om de totaalprijzen met MySQL in een enkele query op te vragen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT
    winkel.id AS winkelid,
    SUM(prijzen.prijs) AS totaalprijs
FROM
    winkels, prijzen
WHERE 
    <expressie die je al had>
GROUP BY
    winkel.id
HAVING
    COUNT(prijzen.product) = <totaal aantal producten>

Als je toch per product de prijs wil weten, dan zou ik het opsplitsen in twee queries: eentje zoals hierboven om de winkels te vinden die alle producten in huis hebben, en een volgende om alleen voor die winkels de prijzen van de producten op te vragen (met de query die je al had, maar dan met een uitgebreide WHERE-expressie).

[ Voor 21% gewijzigd door Soultaker op 11-07-2004 14:50 ]


  • Matthis
  • Registratie: Juli 2004
  • Laatst online: 24-05 10:27
thx,

heb er wat verder aan geklooid en het werkt!

_/-\o_

  • klinz
  • Registratie: Maart 2002
  • Laatst online: 21-05 09:01

klinz

weet van NIETS

Matthis schreef op 12 juli 2004 @ 21:21:
heb er wat verder aan geklooid en het werkt!
Hoe?