Selecten op voorraad en laagste prijs

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roy -

Roy -

22/06/2012 14:49:40
Quote Anchor link
Beste forum leden!

Ik heb deze query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT *
FROM products
WHERE product_id="123"
ORDER BY voorraad DESC, prijs ASC
LIMIT 0,1


Dit werkt bijna goed, maar wil het als volgt:
Van de producten die op voorraad zijn de laagste prijs. Is er geen voorraad? Laagste prijs! Er moet altijd een resultaat komen! Moet dus via "order by"?

Het is nu zo dat wanneer een product veel voorraad heeft deze voorgaat op product met weinig voorraad maar wel met een lagere prijs.

Als ik "voorraad DESC, prijs ASC" omdraai krijg ik wel de laagste prijs maar die heeft soms geen voorraad.

Hoe dit te realiseren?

Alvast bedankt!
Gewijzigd op 22/06/2012 14:51:22 door Roy -
 
PHP hulp

PHP hulp

25/04/2024 02:46:32
 
- SanThe -

- SanThe -

22/06/2012 14:53:10
Quote Anchor link
Aan je LIMIT te zien haal je er maar één op, dus wat valt er te sorteren?

WHERE ... AND voorraad > 0
Gewijzigd op 22/06/2012 14:55:19 door - SanThe -
 
Roy -

Roy -

22/06/2012 15:15:44
Quote Anchor link
Heb het beste resultaat nodig vandaar de limit.

Hiermee "WHERE ... AND voorraad > 0" bedoel je:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT *
FROM products
WHERE product_id="123" AND voorraad > 0
ORDER BY prijs ASC
LIMIT 0,1

?

Als er niets op voorraad is wil ik toch de beste prijs hebben. Op deze manier krijg ik geen resultaat meer.

Toch bedankt voor het meedenken!
Gewijzigd op 22/06/2012 15:22:19 door Roy -
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/06/2012 15:50:50
Quote Anchor link
Heeft een product geen uniek ID?
Geef eens een voorbeeldje van welke je gegevens je kan hebben en wat je er uit geselecteerd wilt hebben.
 
Roy -

Roy -

22/06/2012 16:03:46
Quote Anchor link
Dank voor je reactie!

Producten hebben ook een uniek id maar deze wordt eigenlijk niet gebruik. Er zijn meerdere dezelfde producten. Hiervan moet de meest gunstige (zie uitleg eerder) geselecteerd worden.

Voorbeelden met gegevens en welk resultaat ik wil hebben:

product_id - voorraad - prijs
123 - 0 - 10
123 - 2 - 11
123 - 1 - 12
Hiervan dient de 2e geselecteerd te worden omdat:
Er is voorraad, daarvan de goedkoopste kiezen.

product_id - voorraad - prijs
123 - 0 - 12
123 - 0 - 11
123 - 0 - 12
Hiervan dient de 2e geselecteerd te worden omdat:
Er is geen voorraad, de goedkoopste kiezen.

product_id - voorraad - prijs
123 - 1 - 12
123 - 2 - 11
123 - 3 - 12
Hiervan dient de 2e geselecteerd te worden omdat:
Er is voorraad, de goedkoopste kiezen.
Gewijzigd op 22/06/2012 16:27:04 door Roy -
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/06/2012 18:30:36
Quote Anchor link
Ik denk niet dat je dat in een query kunt oplossen, ik kom er iig niet zo 123 uit dus dan stap ik meestal over op een stored procedure, je krijgt dan zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DELIMITER $$

CREATE PROCEDURE SelectPerfectProduct (IN pid INT(11))
BEGIN
    DECLARE pist INT(11);
    SELECT MAX(voorraad) FROM products WHERE product_id = pid INTO pist;
    IF pist = 0 THEN
        SELECT * FROM products    
        WHERE
            prijs =
            (SELECT MIN(prijs) FROM products  WHERE product_id = pid)
        AND product_id = pid;
    ELSE
        SELECT * FROM products    
        WHERE
            prijs =
            (SELECT MIN(prijs) FROM products  WHERE product_id = pid AND voorraad > 0)
        AND product_id = pid;
    END IF;
END$$

DELIMITER ;

Je kan het dan opvragen via:
CALL(SelectPerfectProduct)
 
Roy -

Roy -

26/06/2012 13:13:35
Quote Anchor link
Even weg geweest, dank voor je bericht!
Heb nog nooit gebruik gemaakt van een stored procedure. Er wordt in de website waar dit moet gebeuren nog gebruik gemaakt van mysql ipv mysqli of beter pdo. Is dit ook uit te voeren via mysql?

Hoe dit uit te voeren en het resultaat eruit halen? Gewoon in mysql_query gooien? En het resultaat eruit halen met bijv. mysql_fetch_assoc?
 
Reshad F

Reshad F

26/06/2012 13:20:57
 
Roy -

Roy -

26/06/2012 13:37:54
Quote Anchor link
Even doorgelezen maar kom er niet tegen hoe dit te verwerken met php (edit: gewoon via mysql_query dus).
Even geprobeerd via phpmyadmin bij SQL, gaat goed! :)
Maar.. een stored procedure wordt in de database opgeslagen (edit: jazeker, in de information_schema)?
Ik voeg dit dus één keer toe (edit: ja want het wordt opgeslagen):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
26
<?php
mysql_query("
DELIMITER $$

CREATE PROCEDURE SelectPerfectProduct (IN pid INT(11))
BEGIN
    DECLARE pist INT(11);
    SELECT MAX(voorraad) FROM producten_leverancier WHERE product_id = pid INTO pist;
    IF pist = 0 THEN
        SELECT * FROM producten_leverancier
        WHERE
            prijs =
            (SELECT MIN(prijs) FROM producten_leverancier WHERE product_id = pid)
        AND product_id = pid;
    ELSE
        SELECT * FROM producten_leverancier
        WHERE
            prijs =
            (SELECT MIN(prijs) FROM producten_leverancier WHERE product_id = pid AND voorraad > 0)
        AND product_id = pid;
    END IF;
END$$

DELIMITER ;
"
);
?>


?

Daarna de code eruit halen en elke keer als ik dit wil uitvoeren dit runnen (edit: ja):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$query
= mysql_query("CALL SelectPerfectProduct(17117);");
$resultaat = mysql_fetch_assoc($query);
$beste = $resultaat['prijs'];
?>



edit:
Wat ik tevens niet tegen kom is de limit, krijg ik met deze stored precedure altijd één resultaat?

Als ik het uitvoer via phpmyadmin krijg ik netjes resultaat maar via php krijg ik:
can't return a result set in the given context

Toevoeging op 26/06/2012 17:35:42:

Inmiddels weer het een en ander geprobeerd en kwam de volgende bug tegen:
https://bugs.php.net/bug.php?id=42548

Kan het zijn dat dit het probleem veroorzaakt? In phpmyadmin werkt het wel... lijkt mij niet?
Gewijzigd op 26/06/2012 14:04:27 door Roy -
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/06/2012 19:53:26
Quote Anchor link
Lijkt mij weer iets met de gebruiker te maken hebben, i.e. als je een procedure create onder gebruiker A heeft gebruiker B geen rechten om die procedure uit te voeren.

Of met de gebruikte extensie? Ik dacht namelijk dat Myadmin dat zelf detecteerde?

PHPMyAdmin gebruikt ook PHP toch?
 
Roy -

Roy -

26/06/2012 21:44:20
Quote Anchor link
Toch de boel maar veranderd en gewoon met php geregeld, alle resultaten loopen en de gewenst resultaten tevoorschijn halen.

Ik duik nog een keer in de stored procedures maar voor nu zo sneller klaar.

Hartelijk dank! Ondanks het anders gedaan te hebben wel weer wat geleerd!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.