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