Choisissez parmi les enregistrements MySQL qui totalisent
-
03-07-2019 - |
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!
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.