質問

1つのフィールドの合計から特定の数に到達するまでレコードを選択することに関するいくつかの投稿があることは知っていますが、私に合ったものはありません。 PHPとMySQLを使用しています。

quantityという名前のテーブルがあります。内部には、製品名、製品価格、製品数量の記録があります。これらのほかに、日付と位置に基づいて最後のレコードを選択するのに役立つ他のいくつかがあります。同じ製品には異なる価格の異なる数量があるため、priceという名前のフィールドのGROUP BYもあります。そのため、現在、製品固有の価格と数量を次のように選択しています。

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に等しいレコードを選択する必要があります。したがって、クエリを使用すると、30の製品を取得できるため、2行目で停止する必要があることがわかります100ドルの価格と、ライン2の価格が120の別の5つの製品が付属していました。そして、更新を入力する必要があります。したがって、新しいデータは次のようになります。

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の方が「明白」なので、好む傾向がありますが、おそらくこれはあなたに思考の糧を与えるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top