MySQL выбирает записи с суммами
Вопрос
Я использую MySQL и PHP. У меня есть таблица, которая содержит столбцы идентификатор и количество. Я хотел бы получить идентификатор строки, которая является последней суммой количества, когда она достигает числа 40 в сумме. Чтобы быть более конкретным. У меня есть 3 строки в базе данных. Один с количеством 10, один с количеством 30 и один с количеством 20. Поэтому, если я суммирую количества, чтобы получить результат 40, я бы суммировал первые два значения ведьмы: 10 + 30 = 40. Таким образом, последний идентификатор, который используется для суммирования числа 40 и 2. Я просто хочу знать идентификатор последней строки, которая используется для завершения суммы 40.
Я бы дал дополнительную информацию, если бы меня спросили. СПАСИБО !!
<Ч>Позвольте мне сказать это так: У меня действительно есть 6 продуктов в моей руке. Первый поступил в мое владение 10-го числа, следующие 3 - 11-го, а последние 2 - 12-го.
Теперь я хочу продать 3 товара со своего склада. И хочу продать их в том порядке, в котором они пришли. Поэтому для покупателя, который хочет 3 продукта, я бы продал ему продукт, который пришел на 10, и 2 продукта из тех, что были на 11.
Для следующего покупателя, которому нужны 2 товара, я бы продал ему один товар с даты 11, оставшейся от последнего заказа из 3 товаров, и еще один из тех, что на 12.
Вопрос в том, как узнать, по какой цене продавался каждый продукт? Я подумал, что если я смогу узнать, какие строки суммируют каждое запрошенное количество, я буду знать, где начинать сумму каждый раз, когда я хочу доставить заказ. Итак, сначала я бы посмотрел, какие строки суммируют 3 продукта, и сохранил идентификатор записи. Для следующего заказа я бы начал подсчет с этого идентификатора и суммировал, пока он не суммирует второй заказ из 2 продуктов и так далее. Я думал, что таким образом я могу отслеживать входящие цены, которые были у каждого продукта. Поэтому я не буду продавать товары с даты 12 по цене, составленной с использованием первых цен.
Надеюсь, ты понимаешь. Мне просто нужно знать, по какой цене был какой-либо из моих продуктов, чтобы я знал, что у первых продуктов будет одна цена, но по мере повышения цен на продукты я тоже должен повышать свои цены ... Так что последние продукты, которые пришли, должны быть проданы за более высокая цена. Я могу добиться этого только в том случае, если буду следить за этим ...
Большое спасибо.
<Ч> Никто? Или еще проще: MySQL должен выбрать необходимые строки, чтобы SUM (quantity
) был выше или равен 40, например. А затем, чтобы получить идентификатор последней строки, которая участвовала в процессе суммирования.
Решение
Я не очень хорошо понимаю ваш вопрос. Можете ли вы попробовать переписать его более правильно? Насколько я понимаю, вот структура вашей базы данных:
ProductID ArrivalDate
1 10
2 11
3 11
4 11
5 12
6 12
Теперь вы спрашиваете, & "Как я узнаю, по какой цене был каждый проданный мной продукт?" Что сорта меня смущает, так как каждое значение в базе данных не имеет ценового атрибута. Разве ваша база данных не должна выглядеть так:
ProductID ArrivalDate Price
1 10 100
2 11 200
3 11 300
4 11 300
5 12 400
6 12 400
Лично я думаю, что ваша идея узнать цену продажи ошибочна. Было бы разумнее добавить еще несколько полей в вашу базу данных:
ProductID ArrivalDate Price InStock DateSold
1 10 100 Yes 17
2 11 200 Yes 17
3 11 300 Yes 18
4 11 300 Yes 18
5 12 400 no
6 12 400 no
Изменяя свою базу данных, вы можете легко отслеживать, когда товар прибывает, дату продажи, его цену, возможно, количество (я не могу сказать, является ли это фактическим полем или нет). Р>
Кроме того, вы можете упростить и упростить свою жизнь, разделив запросы SQL или даже добавив некоторый код, чтобы выполнить часть работы за вас.
Другие советы
Иметь третий столбец с промежуточным итогом. Затем вы можете просто вернуть последнюю строку, в которой промежуточный итог & Lt; = целевое значение.
Итак, ваша таблица должна выглядеть так:
ID Quantity RunningTotal 1 10 10 2 30 40 3 20 60
ПРИМЕЧАНИЕ. Если вы удалите строку в таблице, не забудьте обновить все последующие строки RunningTotal -= DeletedRow.Quantity
!
Использование идентификаторов таблицы, вероятно, является плохой идеей для этого, но если это действительно так, вы можете попробовать что-то вроде этого (не проверено):
SELECT yourTableA.id
FROM yourTable AS yourTableA
JOIN yourTable AS yourTableB
WHERE ( yourTableA.value + yourTableB.value ) = 40
AND yourTableA.id != yourTableB.id
ORDER BY yourTableA.id
Этот тип решения будет работать только в том случае, если вы ожидаете, что вам понадобятся только две строки, чтобы равняться вашей целевой сумме. Поскольку это, скорее всего, не так, лучше всего попытаться получить все строки и сделать это программно на возвращаемых данных.
Решение «Итоговое значение», опубликованное lc, также является хорошим вариантом, хотя я обычно стараюсь избегать хранения вычисленных данных, если в этом нет необходимости.
<Ч>На основании обновленной информации из этого запроса у меня есть альтернативный ответ.
Звучит не так, как будто ты заботишься об инвентаре. Вы больше заботитесь о том, когда поступят продукты.
SELECT *
FROM product
ORDER BY product.receivedData
Обрабатывайте каждую запись по мере ее поступления, сохраняйте цену этой записи и продолжайте столько времени, сколько вам нужно, до тех пор, пока не достигнете необходимого количества элементов. Вы должны получить список предметов, количество инвентаря на этом уровне и цену на этом уровне.