Mysql 选择表的第一行(表中有一列包含int值,其值之和小于输入值)

Mysql 选择表的第一行(表中有一列包含int值,其值之和小于输入值),mysql,sql,database,Mysql,Sql,Database,在这种情况下,我的输入是5,我想选择前两行,删除第一行并更新第二行,将值7而不是10 我试图进行此查询,但这还不够: SELECT SUM(`Qty in acquisto`) AS total,`Prezzo in acquisto` FROM `book` GROUP BY `Qty in acquisto` HAVING COUNT(*) >5 您可以使用变量获取感兴趣的行,以及更新记录所需的信息: SELECT * FROM ( SELECT `Qty i

在这种情况下,我的输入是
5
,我想选择前两行,删除第一行并更新第二行,将值
7
而不是
10

我试图进行此查询,但这还不够:

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

您可以使用变量获取感兴趣的行,以及更新记录所需的信息:

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 |

在最内部的查询中,使用alias init传递所需的图书数量(示例中为5)

因此,在列
adjusted_acquisito
中,您可以找到执行删除和更新所需的值:

如果该值为0,则删除相应的记录

如果该值不是0,则使用该值更新数量。

例如:

 SELECT * FROM my_table;
+------+--------+
| id   | amount |
+------+--------+
|  800 |      8 |
|  900 |      3 |
|  950 |      4 |
|  960 |     10 |
| 1000 |      2 |
+------+--------+
SELECT n.id
     , GREATEST(amount-@x,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 |
+------+--------+------------+------+

您的表是否有一个id或任何您可以用来订购的内容,以便您知道哪条记录是第一、第二……当然,“Quantity in acquisto”是第一列的名称,“Prezzo in acquisto”是第二列的名称。但我需要按“Prezzo in acquisto”降序订购,以便让最高价格位于ta的顶部可悲的。