2013-03-02 5 views
2

У меня есть база данных SQL, и я хочу получить записи до тех пор, пока не будет удовлетворено количество запросов клиента. Вот что я имею в виду. Таблица запросовFetch Row до тех пор, пока количество не будет выполнено

Product  Quantity Price 
----------------------- 
Apple   10.0  5.00 

вот SQL-запрос, чтобы получить матчи:

SELECT c.FName, 
     p.ProductName, 
     s.Description, 
     s.Quantity, 
     s.Price 
FROM requests r 
    INNER JOIN sellers s 
     ON r.ProductID = s.ProductID 
    INNER JOIN products p 
     ON p.ProductID=s.ProductID 
    INNER JOIN customers c 
     ON c.ID=s.C_ID  
WHERE r.C_ID = 3 AND r.matchType='Price' 
ORDER BY s.Price ASC 

И вот результат:

 FName | ProductName |  Description     | Quantity | Price 
    --------------------------------------------------------------------------= 
compny1   Apple     royal apples fm appleco.  5.0   5.00 
    daz   Apple      sweet apples    6.0   5.50 
company2   Apple      Apples yum     8.0   9.00 

Я хочу, чтобы отобразить полное требуемое количество 10кг, выбрав строки и обновление базы данных, то есть выход должен быть:

apples @5kg from compny1 = 5.00 
apples @5kg from daz = 5.50 
total = 10.50 

База данных должна показывать количество «Daz», равное 1,0 кг слева. Тем не менее, я продолжаю сосать это. Я попытался сделать следующее:

while ($rows1 = mysql_fetch_assoc($queryQuantity2)){ 

     if($rows1['Quantity']==$quantityRequested){ //If the first row = 10KG output only this row. 
echo $rows1['FName']; 
echo $rows1['NameProduct']; 
echo $rows1['Quantity']; 
echo $rows1['Price']; 
}else{ 
//stuck here check the next rows and see there is 6KG's .. We need 10KG Requested - 5KG from daz(row1) 
//                   -Remaining amount left(i.e.5KG) 
//hence, print the output specified above and UPDATE Database where quantity has been reduced by X amount. 
} 

Хорошо, в чем проблема. Мне нужно «Подготовить» запрошенный 10кг запрос.

Теперь «Самый дешевый» способ сделать это - отсортировать доступные совпадения по Asc Price, которые у меня есть.

Нет, мы видим, что первая строка показывает «compny1», продавая 5KG за 5,00 фунтов ... Итак, нам нужно 10KG, поэтому мы показываем строку 1 .. Далее, поскольку мы еще не встретили требования 10KG (все еще нужно еще 5 кг), мы смотрим на второй ряд. Мы видим, что «daz» продает 6 кг. но нам нужно всего лишь 5more KG, чтобы удовлетворить спрос 10KG. Следовательно, я хочу ... UPDATE таблицу, чтобы первая запись была скопирована в другую таблицу, а вторая строка обновлена ​​до 1.0kg (6KG-5KG). И, следовательно, дисплей клиента: Ваш 10кг можно приобрести

compny1 [email protected] 
daz [email protected] 
------ 
Total £10.50 

Итак, это моя проблема. Я не знаю, как продолжать проверять строки до тех пор, пока не будет выполнено требуемое количество. Думаю, мне нужен какой-то «счетчик», который отслеживает, сколько добавлено количество добавлено «До сих пор», а затем проверить, сколько еще потребуется от следующей строки.

+0

Итак, вы хотите остановить свои возвращенные результаты, как только вы встретите определенные критерии, в этом случае количество 10? Как вы получаете 5.50 для возврата ядов с daz с 6 из 5,50 - 5 должно стоить 4,58? Просто пытаюсь понять ваши проблемы. – sgeddes

+0

@sgeddes Да. Как только количество было удовлетворено (10 кг в этом случае), спрос был удовлетворен, поэтому больше строк не должно отображаться. Да, жаль насчет калькуляции затрат, которая является всего лишь образцом и тестовыми данными. После того, как я поменю его на цену за кг, а затем отсортирую список. – Jsmith

ответ

0

Хотя там может быть упрощенный вариант этого, это должно быть очень близко:

Select FName, 
    IF(summedQty>10,Quantity-(summedQty-10),Quantity) Quantity, 
    Price 
From (
    Select 
    FName, 
    Quantity, 
    Price, 
    @qtySum:=IF(@qtySum>10,10000,@qtySum+Quantity) summedQty 
    From Results 
    Join (Select @qtySum:=0) t 
    Order By Price 
) t 
Where summedQty != 10000 

Я использовал 10000 как произвольное значение, я знаю, я никогда не бил - просто убедитесь, что она выше, чем любой потенциальная ценность. И везде, где я использовал 10, вам нужно будет заменить максимальное значение.

SQL Fiddle Demo

Если вы не хотите использовать произвольное значение, как, например, это, кажется, работает точно так же:

Select FName, 
    IF(summedQty>10,Quantity-(summedQty-10),Quantity) Quantity, 
    Price 
From (
    Select 
    FName, 
    Quantity, 
    Price, 
    @qtySum:[email protected]+Quantity summedQty 
    From Results 
    Join (Select @qtySum:=0) t 
    Order By Price 
) t 
Where IF(summedQty>10,Quantity-(summedQty-10),Quantity) > 0 

SQL Fiddle Demo

Как я уже сказал, я конечно, есть вариации, но это должно заставить вас идти в правильном направлении.

+0

Привет, Спасибо за ваш ответ. Это может показаться действительно допируемым, но я использую mySQL (PHP myAdmin). Я не видел такого синтаксиса перед использованием IF в SQL-запросах. Можете ли вы использовать такие запросы для php/sql. Также 10KG для этого клиента у других клиентов будут запрашиваться разные количества. Я в идеале думал, что PHP использует для обработки результата и обновления таблицы. Тем не менее, я не знаю, как это сделать: '( – Jsmith

+0

@Jsmith - Вы можете определенно использовать IF-инструкции в своих SQL-операторах из PHP - действительный синтаксис SQL. Вам нужно будет заменить 10 на все значение было специфичным для этого клиента.Я пытался получить вам решение MySQL и решение PHP.И кстати, я уверен, что вы заметили, я использовал поддельную таблицу результатов - замените ее на ваш фактический запрос. С уважением! – sgeddes

+0

Спасибо за предложение ur, я буду использовать его, чтобы помочь мне решить мою проблему. Я просто подумал, что, возможно, использование PHP будет немного легче для меня понять, поскольку я до сих пор не использовал такой синтаксис SQL: – Jsmith

Смежные вопросы