[MYSQL] Aantal verkochte producten tellen

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

  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 23:20
Ik zit met een klein probleempje.

Ik heb een eigen webshop gemaakt, in het CMS hiervan wil ik per product tellen hoe vaak het is verkocht. Dit is geen probleem. Maar, wanneer ik wil sorteren op het aantal verkopen loop ik vast.

De tabellen zien er als volgt uit:

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE TABLE `shop_order_products` (
  `id` int(11) NOT NULL auto_increment,
  `id_user` int(11) NOT NULL default '0',
  `id_product` int(11) NOT NULL default '0',
  `id_order` int(11) NOT NULL default '0',
  `number` decimal(4,0) NOT NULL default '0',
  `price` decimal(5,2) NOT NULL default '0.00',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

-- --------------------------------------------------------

-- 
-- Tabel structuur voor tabel `shop_products`
-- 

CREATE TABLE `shop_products` (
  `id` int(11) NOT NULL auto_increment,
  `id_subcategory` int(11) NOT NULL default '0',
  `date` decimal(10,0) NOT NULL default '0',
  `price` decimal(5,2) NOT NULL default '0.00',
  `name` varchar(50) NOT NULL default '',
  etc etc etc
  PRIMARY KEY  (`id`)
) TYPE=MyISAM ;


Zelf had ik iets dergelijks als dit in gedachten:

MySQL:
1
2
3
4
$productsq = mysql_query("SELECT p.id,p.date,p.price,p.name,p.brand,p.stock,p.offer,p.hot
                            FROM shop_products AS p, shop_order_products AS o
                            WHERE o.id_product = p.id
                            ORDER BY SUM(o.number)") or die(mysql_error());


ik krijg de volgende error: Invalid use of group function

[ Voor 14% gewijzigd door GewoonNico op 25-01-2005 14:39 . Reden: typo ]


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

Je zult moeten groeperen op product:
SQL:
1
2
3
4
5
SELECT p.id, p.date, p.price, p.name, p.brand, p.stock, p.offer, p.hot, SUM(o.number) AS aantal
FROM shop_products AS p, shop_order_products AS o
WHERE o.id_product = p.id
GROUP BY p.id, p.date, p.price, p.name, p.brand, p.stock, p.offer, p.hot
ORDER BY aantal

Dit zou volgens mij moeten werken, maar ik heb het niet getest. In de FAQ staat ook nog een mooi stukje over groeperen

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 23:20
SUPER!
Dankje!

Ik was mijn oude schoolboeken er al bij aan het halen en op de mysql site staat het ook maar slecht uitgelegd allemaal!

  • DutchTSE
  • Registratie: Februari 2003
  • Niet online
jup, je mist de GROUP BY .....
Dat er nog even bij zou moeten werken....

edit: en ik was weer te laat :Y)

[ Voor 28% gewijzigd door DutchTSE op 25-01-2005 14:56 ]


Verwijderd

sorry dat ik me bij dit topic aansluit, maar op een ander forum vroeg iemand dit:
de tabel met nieuwsitems
Afbeeldingslocatie: http://www.webdeveloping.nl/upload/?7134395216

de tabel met reacties
Afbeeldingslocatie: http://www.webdeveloping.nl/upload/?2460704647

wat ik dus wil laten zien zijn de 5 nieuwsitems waar als laatste een reactie op geweest is en het aantal reacties dat op die items is (doe ik nu met 2 queries, kan ook vast wel in 1 lijkt me).
en ik stelde dit voor:

code:
1
2
3
4
5
6
7
8
9
10
select
      item.titel, item.datum,
      max(react.id) as last_react, count(react.id) as react_cnt
from 
      nieuwsitems item inner join reacties react on react.item = item.id
group by
      item.titel, item.datum
order by
      max(item.id) desc
limit 0,5


en ook hij kreeg een invalid use of group function.
Waarschijnlijk mag ik geen 2 aggregate functions in dezelfde set plaatsen? Of weet iemand de echte reden.

(ik vraag dit puur uit nieuwsgierigheid, ik heb al meer dan een jaar geen MySQL gezien :))

het originele topic staat hier

[ Voor 8% gewijzigd door Verwijderd op 25-01-2005 15:31 . Reden: ubb tags ]


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

het zit em volgens mij in 'order by max(item.id) desc'. Die max moet daar weg het is ook gewoon overbodig.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Yo-han
  • Registratie: December 2001
  • Laatst online: 12-04 12:42

Yo-han

nope.

Het is idd niet correct om MAX() of SUM() te gebruiken in the ORDER BY en totaal zinloos. Het sorteren gebeurt oplopend (ASC) of aflopend (DESC). Je kiest een kolom, of meerdere kolommen, die je als sleutel wil gebruiken voor je ORDER BY en list het resultaat.

Niet meer, niet minder :Y)

  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 23:20
Om weer terug te komen op mijn topic :p


De query die mij is gegeven werkt perfect. Op 1 ding na...
Producten die nog nooit zijn verkocht, worden niet gevonden

MySQL:
1
2
3
4
5
$productsq = mysql_query("SELECT p.id, p.date, p.price, p.name, p.brand, p.stock, p.offer, p.hot, SUM(o.number) AS aantal
FROM shop_products AS p, shop_order_products AS o
WHERE o.id_product = p.id
GROUP BY p.id, p.date, p.price, p.name, p.brand, p.stock, p.offer, p.hot
ORDER BY aantal DESC") or die(mysql_error());

[ Voor 5% gewijzigd door GewoonNico op 31-01-2005 16:31 ]


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

partypas schreef op maandag 31 januari 2005 @ 16:31:
Om weer terug te komen op mijn topic :p


De query die mij is gegeven werkt perfect. Op 1 ding na...
Producten die nog nooit zijn verkocht, worden niet gevonden

MySQL:
1
2
3
4
5
$productsq = mysql_query("SELECT p.id, p.date, p.price, p.name, p.brand, p.stock, p.offer, p.hot, SUM(o.number) AS aantal
FROM shop_products AS p, shop_order_products AS o
WHERE o.id_product = p.id
GROUP BY p.id, p.date, p.price, p.name, p.brand, p.stock, p.offer, p.hot
ORDER BY aantal DESC") or die(mysql_error());
Dat klopt, aangezien die producten nog niet in shop_order_products voor komen. Kijk eens naar LEFT OUTER JOIN.

Programmer - an organism that turns coffee into software.


Verwijderd

Ik ben niet zo thuis in MySQL, maar wanneer je
code:
1
2
FROM shop_products AS p, shop_order_products AS o
WHERE o.id_product = p.id

vervangt door
code:
1
2
FROM shop_products AS p LEFT JOIN shop_order_products AS o
ON o.id_product = p.id

zou 't moeten werken, dacht ik zo...
Die intrinsic join die je gebruikt geeft alleen maar records terug wanneer er 'rechts' ook gegevens gevonden worden. Bij een left join is dat niet het geval.

  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 23:20
Nope, werkt niet:
Dit is de error

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON o.id_product = p.id GROUP BY p.id, p.date, p.price,

Verwijderd

Zoals gezegd, ik ben niet zo thuis in MySQL. Ik weet echter wel zeker dat die syntax in bv. MSSQL of InterBase prima zal werken.

Anyway, dit is wel de richting waar je 't moet zoeken.

Verwijderd

Met de faq moet je het denk wel kunnen redden. :)
[url] P&W FAQ - SQL [/url]

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

partypas schreef op dinsdag 25 januari 2005 @ 14:55:
en op de mysql site staat het ook maar slecht uitgelegd allemaal!
offtopic:
Sorry? Je kan veel over MySQL zeggen, maar niet dat hun documentatie niet deugt. Die is best netjes onderhouden en duidelijk. Ik ben dus bang dat als je daar niets in kan vinden, je of niet goed genoeg kijkt, of niet lang genoeg. :)

'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.

Pagina: 1