有没有高效的SQL语句能解决下面的问题?谢谢!!
题:有一水缸(知道里面有50升水),有10几个人排着队去分水,他们桶的大小都不一样,有的17升,有的15升...问:有几个人能分到水?最后一个分到水的人,得到了多少升水?
注:
有一个已知数 [ 50 ]
有一个表
+--+--+--+--+--+-----+
|序|01|02|03|04|.....|
+--+--+--+--+--+-----+
|值|17|15|18|14|.....|
+--+--+--+--+--+-----+
我用的是MySQL 我认为没有
道理有:
1,干什么的东西就是干什么的,SQL(结构化查询语言)是用来处理2维关系的
2,以上的数据结构是链表,你应该用处理链表的方法去处理,简单说就是编程.
3,锅是做饭的,勺是吃饭的不能反过来
3.1明白了吗? 也许你写个暴复杂的udf可以做这件事情 不过......有点吃饱了撑的 我现在只想到了,但和SQL无关:
获取按编号排列的数据。
从第一个开始累加水桶容量,没超过就读取下一个数据。直到超过(或等于)为止。
这样读取过的数据所代表的人打到了水。 这两天查找了 www.mysql.com 上面的资料,
总算想到了解决的方法。
在mysql5.0 上可行,用了存储过程
下面是我的做法,如果有更方便的请告诉我,谢谢!
>
mysql> select * from w; // 分水前
+------+-------+
| id | water |
+------+-------+
| 1 | 5 |
| 2 | 2 |
| 3 | 6 |
| 4 | 6 |
| 5 | 6 |
| 6 | 6 |
| 7 | 6 |
+------+-------+
7 rows in set (0.01 sec)
mysql> delimiter |
mysql> CREATE PROCEDURE fs (IN in_v INT)
-> BEGIN
-> DECLARE done INT DEFAULT 0;
->
-> DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
-> DECLARE cur1 CURSOR FOR SELECT id,water FROM tmp.w;
->
-> DECLARE a CHAR(16);
-> DECLARE v,b,c,d INT;
-> set v=in_v;
-> set d = 0;
-> OPEN cur1;
->
-> REPEAT
-> FETCH cur1 INTO a, b;
->
-> IF NOT done THEN
-> IF v < b THEN
-> set c = b - v;
-> UPDATE tmp.w SET water=c WHERE id=a;
-> set v = 0;
-> set d=d+1;
-> set done =1;
-> ELSE
-> UPDATE tmp.w SET water=0 WHERE id=a; // 例句1
-> set v = v - b;
-> set d=d+1;
-> END IF;
-> END IF;
-> UNTIL done END REPEAT;
->
-> // 本来想把 例句1 写在这里,变成:UPDATE tmp.w SET water=0 WHERE id in (1,2,...);
-> // 但是因为刚学SQL 不知道怎样把 (1,2,...) 付给变量,所以就放弃了。:(
-> // 望高人指点指点!如何写:变量A = (1,4,2,6,)
-> set @ii = c;
-> set @jj = d;
-> CLOSE cur1;
-> END;|
Query OK, 0 rows affected (0.01 sec)
mysql> call fs(12);|// 开始分水,共有12升
Query OK, 0 rows affected (0.00 sec)
mysql> select * from w;| // 分水后
+------+-------+
| id | water |
+------+-------+
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
| 4 | 6 |
| 5 | 6 |
| 6 | 6 |
| 7 | 6 |
+------+-------+
7 rows in set (0.00 sec)
mysql> select @ii;|
+------+
| @ii|
+------+
| 1 |
+------+
1 row in set (0.00 sec) //最后一个分得水 1升
mysql> select @jj;|
+------+
| @jj|
+------+
| 3 |
+------+
1 row in set (0.00 sec) // 共有3个人分得水
页:
[1]