質問
MySQLとPHPを使用しています。列idと数量を含むテーブルがあります。合計で数値40に達したときに最後に合計する行のIDを取得したいと思います。具体的には。データベースに3行あります。 1つは数量10、1つは数量30、もう1つは数量20です。したがって、数量を合計して結果が40になる場合、最初の2つのウィッチ平均を合計します:10 + 30 = 40。 40の合計が2であるために使用されます。40の合計を完了するために使用される最後の行のIDを知りたいだけです。
質問があれば詳細をお知らせします。ありがとう!!
このようにしましょう: 私は本当に6つの製品を手にしています。最初の1つは10日に、次の3つは11に、最後の2つは12に私の所有になりました。
今、在庫から3つの製品を販売したいと思います。そして、彼らが来た順序でそれらを販売したい。したがって、3つの製品が必要なお客様には、10種類の製品と11種類の製品から2種類の製品を販売します。
2つの製品を必要とする次の顧客に対して、3つの製品の最後の注文から残っている11の日付から1つの製品を販売し、12の製品から別の製品を販売します。
質問は、販売した各製品の価格をどのようにして知ることができるかということです。どの行がリクエストされたすべての数量を合計するかを見つけることができれば、注文を出すたびに合計を開始する場所がわかると思いました。そのため、最初にどの行が3つの製品を合計するかを調べ、エントリIDを保持します。次の注文では、そのIDからカウントを開始し、2つの製品の2番目の注文を合計するまで合計します。このようにして、各製品にかかった価格を追跡できると思いました。そのため、12日以降の製品を、最初の価格を使用した価格で販売することはありません。
ご理解いただければ幸いです。製品の価格を知る必要があるので、最初の製品には1つの価格がありますが、製品の価格が上がると、価格も上げる必要があります...最後に来た製品は販売する必要がありますより高い価格。私はこれを追跡する場合にのみそれを達成することができます...
ありがとうございます。
誰も?または、さらに簡単に:MySQLは、SUM(quantity
)が必要な行を選択して、たとえば40以上にする必要があります。そして、合計プロセスに参加した最後の行のIDを取得します。
解決
あなたの質問をよく理解していません。もっと適切に言い換えることができますか?私の解釈から、データベースの構造は次のとおりです。
ProductID ArrivalDate
1 10
2 11
3 11
4 11
5 12
6 12
今、あなたは尋ねています、<!> quot;どのようにどの価格が私が販売した各製品を持っているか<!> quot;を知ることができますか?データベースの各値には価格属性がないため、これは私を混乱させます。データベースは次のようにはなりません:
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クエリを分離するか、いくつかの作業を行うためのコードを追加することで、単純化して生活を楽にすることができます。
他のヒント
積算合計を含む3番目の列を用意します。次に、現在の合計が<!> lt; =目標値である最後の行を返すだけです。
したがって、テーブルは次のようになります。
ID Quantity RunningTotal 1 10 10 2 30 40 3 20 60
注:テーブル内の行を削除する場合、後続のすべての行を必ず更新してくださいRunningTotal -= DeletedRow.Quantity
!
テーブルIDに依存するのはおそらく悪い考えですが、それが実際に行われる方法であれば、次のようなものを試すことができます(テストされていません):
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
このタイプのソリューションは、ターゲット合計と等しくなるために必要なのは2行のみであると予想される場合にのみ機能します。これはほとんどの場合そうではないので、最善の策は、おそらくすべての行を取得して、返されたデータに対してプログラム的にこれを実行することです。
lcが投稿したRunning Totalソリューションも良いオプションですが、絶対に必要な場合を除き、通常は計算されたデータを保存しないようにしています。
このリクエストの更新情報に基づいて、別の回答があります。
在庫を気にかけているようには聞こえません。製品がいつ入荷したかを気にかけます。
SELECT *
FROM product
ORDER BY product.receivedData
各レコードが到着するたびに処理し、そのレコードの価格を保存し、必要なアイテムの数に達するまで必要な限り継続します。最終的に、アイテムのリスト、そのレベルの在庫数、そのレベルの価格が表示されます。