Выберите из записей MySQL, что суммы - PullRequest
1 голос
/ 03 марта 2009

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

У меня есть таблица с именем количества. Внутри есть записи названия продукта, цены продукта и количества продукта. Помимо этого, есть несколько других, которые помогают мне выбрать последние записи на основе даты и позиции, а также поле GROUP BY с именем 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 Ответ

1 голос
/ 03 марта 2009

Вариант 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, потому что он более «очевиден», но, возможно, это даст вам пищу для размышлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...