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的顶部可悲的。