سؤال

أعلم أن هناك عددًا قليلاً من المنشورات هنا حول اختيار السجلات حتى يتم استيفاء رقم معين من مجموع حقل واحد ولكن لا يوجد أي شيء يناسبني.أنا أستخدم PHP و MySQL.

لدي جدول اسمه الكميةيوجد بالداخل سجلات لاسم المنتج وسعر المنتج وكمية المنتج.بالإضافة إلى ذلك، هناك عدد قليل من السجلات الأخرى التي تساعدني في تحديد السجلات الأخيرة بناءً على التاريخ والموضع، بالإضافة إلى المجموعة حسب الحقل المسمى السعر نظرًا لوجود كميات مختلفة بأسعار مختلفة لنفس المنتج.لذلك، أقوم حاليًا بتحديد السعر والكمية المحددة لمنتجي على النحو التالي:

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

يعد هذا الاستعلام حلاً بديلاً لأنني بحاجة للحصول على بيانات مثل هذا:

product_name   |    price  |    quantity

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

على افتراض أن لدي سجلات متعددة مثل هذه وأحتاج إلى الحصول على أحدثها.على أية حال، من هذا الاستعلام أحتاج إلى القيام بما يلي:أحتاج إلى تحديد السجلات التي مجموع الكمية مع كمية منتج آخر يساوي 35.لذلك، باستخدام الاستعلام الخاص بي، أعلم أنه يجب أن يتوقف عند السطر 2 لأنه يمكنني الحصول على 30 منتجًا جاءت بسعر 100 دولار و5 منتجات أخرى من السطر 2 بسعر 120.وبعد ذلك سأحتاج إلى إدخال تحديثاتي.لذا، ستبدو البيانات الجديدة كما يلي:

product_name   |    price  |    quantity

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

كيف في العالم سأحقق هذا؟أتمنى أن تكون تفاصيلي واضحة.من فضلك، اسأل أي سؤال.

شكرا لك على وقتك!

هل كانت مفيدة؟

المحلول

الخيار 1:استخدم منطق البرنامج بدلاً من الاستعلام:

لا حرج في استخدام طبقة البرمجة لإجراء تفاعلات قاعدة بيانات أكثر تقدمًا.SQL ليست إجابة على كل شيء ...(ضع في الاعتبار أيضًا الإجراء المخزن).

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

الخيار 2:استخدم استعلامًا بإجمالي قيد التشغيل:

في هذا الخيار، يمكنك الحصول على الإجمالي الجاري باستخدام استعلام مشتق، ثم تصفيته وصولاً إلى سجلات محددة في الاستعلام الخارجي.إذا كنت تنوي تحديثها، فيجب عليك تغليف ذلك في معاملة بمستوى العزل الصحيح.

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

أميل إلى تفضيل الخيار 1 لأنه أكثر "وضوحًا"، ولكن ربما سيمنحك هذا بعض الطعام للتفكير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top