MySQL kayıtlarından seçmenizi toplamları

1 Cevap php

Ben belli bir sayıda bir alanın toplamından bir araya geldi ama bana uygun herhangi olmadığı kadar kayıtları seçerek hakkında burada birkaç sonrası olduğunu biliyorum. PHP ve MySQL kullanıyorum.

Ben bir tablo adında bir miktar var. İçinde ürün adı, ürün fiyatı ve ürün miktarı kayıtları vardır. Bunların yanı sıra, farklı miktarları aynı ürün için farklı fiyatlar ile vardır çünkü lutfen alan adında fiyat GROUP BY olarak, ben tarih ve pozisyona dayalı son kayıtları seçmek yardımcı olan birkaç kişi var. Yani, şu anda böyle benim ürünün belirli bir fiyat ve miktar seçin:

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

Ben bu gibi verileri almak gerekir, çünkü bu sorgu bir geçici çözüm:

product_name   |    price  |    quantity

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

Ben bu gibi birden fazla kayıt var ve ben onları son almak gerektiğini asuming. Her neyse, bu sorgudan ben aşağıdakileri yapmanız gerekir: Ben başka bir ürünün miktarı ile toplandığında miktar 35 eşit oluyor kayıtları seçmek gerekiyor ben 30 ürün alabilir çünkü Yani, benim sorgu kullanarak bunu hattında 2 durmam gerektiğini biliyorum. Bu 100 $ fiyat ve 120 fiyatı var 2. hattan başka bir 5 ürünleri ile geldi. Ve sonra benim güncelleştirmeleri girmeniz gerekir. Yani, yeni veri gibi görünecektir:

product_name   |    price  |    quantity

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

Nasıl dünyada ben bunu başarmak için gidiyorum? Benim ayrıntıları netleşti umuyoruz. , Herhangi bir soru sormak lütfen.

Zaman ayırdığınız için teşekkür ederiz!

1 Cevap

Option 1: Use program logic instead of a query:

Daha gelişmiş veritabanı etkileşimleri yapmak için programlama katmanı kullanarak yanlış bir şey yoktur. SQL her şeye bir cevap değil ... (Ayrıca bir saklı yordam düşünün).

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: Use a query with a running total:

Bu seçenekte, türetilmiş bir sorgu kullanarak çalışan bir toplam elde etmek ve daha sonra dış sorguda belirli kayıtlara aşağı filtre. Eğer onları güncelleme niyetinde ise, doğru yalıtım düzeyi ile bir işlemde bu sarılmalıdır.

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


Daha "açık" olduğu için 1. seçeneği tercih eğiliminde olacaktır, ama belki bu size düşünce için yiyecek verecek.