Вопрос

Я знаю, что здесь есть несколько сообщений о выборе записей до тех пор, пока не будет выполнено определенное число из суммы одного поля, но ни одно из них мне не подходит.Я использую PHP и MySQL.

У меня есть таблица с именем quantity.Внутри находятся записи о названии продукта, цене продукта и количестве продукта.Помимо этих, есть несколько других, которые помогают мне выбирать последние записи на основе даты и позиции, а также ГРУППИРОВАТЬ ПО полю с именем price, потому что есть разные количества с разными ценами на один и тот же продукт.Итак, в настоящее время я выбираю конкретную цену и количество моего продукта следующим образом:

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