2016-08-27 11 views
2

この場合、入力は5で、最初の2行を選択して最初の行を削除する代わりに、10の値7を入れて、二番目を更新するためにテーブルの最初の行を選択する(値の合計が入力よりも小さい列を持つ)

enter image description here

私はこのクエリを実行しようとしましたが、それは十分ではありません:。

SELECT SUM(`Qty in acquisto`) AS total,`Prezzo in acquisto` 
FROM `book` 
GROUP BY `Qty in acquisto` 
HAVING COUNT(*) >5 
+0

は、あなたのテーブルには、あなたがそうあなたは、第1、第2、... – trincot

+0

必ず、「acquistoで数量」がされているレコードを知ることにより、注文する際に使用できるIDか何かを持っています最初の列の名前、「取得するPrezzo」は2番目の列の名前です。しかし、私はテーブルの上で最高の価格をさせる方法で、降順で 'acquizo'で 'Prezzo'で注文する必要があります。 – pirusti

答えて

1

あなたが行を取得するために、変数を使用することができます関心が、一緒にあなたがレコードを更新するために必要な情報を持つ:

SELECT * 
FROM (
    SELECT `Qty in acquisto`, 
      `Prezzo in acquisto`, 
      @take := least(`Qty in acquisto`, @needed) as taken, 
      `Qty in acquisto` - @take as adjusted_acquisto, 
      @needed := @needed - @take as still_needed 
    FROM  book, 
      (select @needed := 5) as init 
    ORDER BY `Prezzo in acquisto` DESC) base 
WHERE taken + still_needed > 0 

サンプルデータの出力は次のようになります。

| Qty in acquisto | Prezzo in acquisto | taken | adjusted_acquisto | still_needed | 
|-----------------|--------------------|-------|-------------------|--------------| 
|    2 |    1000 |  2 |     0 |   3 | 
|    10 |    960 |  3 |     7 |   0 | 

は別名で、最も内側のクエリでSQL fiddle

を参照してくださいinitでは、必要な本の数を渡します(この例では5)。

だから、列adjusted_acquistoにあなたが削除して更新を実行する必要がある値を見つける:その値が0の場合、対応するレコードを削除し、

を。

この値は0ではないため、その値でQtyを更新します。

1

例:

SELECT * FROM my_table; 
+------+--------+ 
| id | amount | 
+------+--------+ 
| 800 |  8 | 
| 900 |  3 | 
| 950 |  4 | 
| 960 |  10 | 
| 1000 |  2 | 
+------+--------+ 
SELECT n.id 
    , GREATEST([email protected],0) new_amount 
    , @x:=GREATEST(@x-amount,0) x 
    FROM my_table n 
    , (SELECT @x:=5) vars 
ORDER 
    BY id DESC; 
+------+--------+------------+------+ 
| id | amount | new_amount | x | 
+------+--------+------------+------+ 
| 1000 |  2 |   0 | 3 | 
| 960 |  10 |   7 | 0 | 
| 950 |  4 |   4 | 0 | 
| 900 |  3 |   3 | 0 | 
| 800 |  8 |   8 | 0 | 
+------+--------+------------+------+ 
関連する問題