Выберите из записей MySQL, что суммы
Я знаю, что здесь есть несколько постов о выборе записей, пока не будет получено определенное число из суммы одного поля, но нет подходящих мне. Я использую 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. Используйте программную логику вместо запроса:
Нет ничего плохого в использовании уровня программирования для более сложных взаимодействий с базой данных. 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, потому что он более "очевиден", но, возможно, это даст вам пищу для размышлений.