Question

Je sais que quelques articles ont été publiés sur la sélection d'enregistrements jusqu'à ce qu'un certain nombre soit atteint à partir de la somme d'un champ, mais aucun ne me convient. J'utilise PHP et MySQL.

J'ai une table nommée quantité. À l'intérieur, il y a des enregistrements du nom du produit, du prix du produit et de la quantité de produit. En plus de ceux-ci, quelques autres m'aident à sélectionner les derniers enregistrements en fonction de la date et de la position, ainsi que GROUP BY dans le champ nommé price car il existe différentes quantités avec des prix différents pour le même produit. Ainsi, je sélectionne actuellement le prix et la quantité spécifiques à mon produit, comme suit:

SELECT `price`,`quantity` FROM (SELECT `price`,`quantity` FROM `quantity` WHERE `product_name` = 'DELL' ORDER BY `date` DESC, `position`) AS `Actions` GROUP BY `price`

Cette requête est une solution de contournement, car j'ai besoin d'obtenir des données telles que:

product_name   |    price  |    quantity

DELL           |     100   |      30
DELL           |     120   |      10
DELL           |     130   |      2

supposant que j'ai plusieurs enregistrements comme ceux-ci et que je dois obtenir le dernier. Quoi qu'il en soit, à partir de cette requête, je dois effectuer les opérations suivantes: Je dois sélectionner les enregistrements dont la quantité est additionnée à la quantité d'un autre produit égale à 35. Ainsi, en utilisant ma requête, je sais qu'elle doit s'arrêter à la ligne 2 car je peux prendre les 30 produits. cela est venu avec le prix de 100 $ et 5 autres produits de la ligne 2 qui a le prix de 120. Et puis, je devrais entrer mes mises à jour. Ainsi, les nouvelles données ressemblent à ceci:

product_name   |    price  |    quantity

DELL           |     100   |      0
DELL           |     120   |      5
DELL           |     130   |      2

Comment vais-je pouvoir y parvenir? J'espère que mes détails sont clairs. S'il vous plaît, posez n'importe quelle question.

Merci pour votre temps!

Était-ce utile?

La solution

Option 1: utilisez la logique du programme au lieu d'une requête:

Il n’ya rien de mal à utiliser la couche de programmation pour effectuer des interactions plus avancées avec la base de données. SQL n'est pas une réponse à tout ... (considérez également une procédure stockée).

enough = 35
running_total = 0

START TRANSACTION
while running_total < enough:
    select one record order by price limit 1 FOR UPDATE
    add to running_total

UPDATE records...
COMMIT

Option 2: Utiliser une requête avec un total cumulé:

Dans cette option, vous obtenez un total cumulé à l'aide d'une requête dérivée, puis vous le filtrez en fonction d'enregistrements spécifiques dans la requête externe. Si vous avez l'intention de les mettre à jour, vous devez envelopper cette opération dans une transaction avec le bon niveau d'isolement.

SET @running_total = 0;
SELECT
    row_id,
    product_name,
    price,
    quantity
FROM
    (
    SELECT 
        row_id, 
        product_name, 
        price, 
        quantity, 
        @running_total := @running_total + quantity AS running_total
    FROM 
        sometable
    WHERE
        quantity > 0
    ORDER BY
        quantity
    LIMIT 
        35  /* for performance reasons :) */
    ) as T1
WHERE
    running_total < 35

J'aurais tendance à préférer l'option 1, car elle est plus "évidente", mais cela vous donnera peut-être matière à réflexion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top