1

PHPとMySQLを使用しています。

数量という名前のテーブルがあります。中には商品名、商品価格、商品数量の記録があります。これらに加えて、日付と位置に基づいて最後のレコードを選択するのに役立つ他のいくつかの方法と、価格という名前のフィールドの 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 ドルの商品と、価格が 120 の明細行 2 からの別の 5 つの商品が付属していました。その後、更新情報を入力する必要があります。したがって、新しいデータは次のようになります。

product_name   |    price  |    quantity

DELL           |     100   |      0
DELL           |     120   |      5
DELL           |     130   |      2

どうすればこれを達成できますか?

4

1 に答える 1

1

オプション 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 の方が「明白」であるため、私はオプション 1 を好む傾向がありますが、おそらくこれは検討の材料になるでしょう。

于 2009-03-03T02:16:25.253 に答える