tryso 发表于 2004-3-4 10:13:29

有没有高效的SQL语句能解决下面的问题?谢谢!!

题:有一水缸(知道里面有50升水),有10几个人排着队去分水,他们桶的大小都不一样,有的17升,有的15升...

问:有几个人能分到水?最后一个分到水的人,得到了多少升水?

注:
有一个已知数 [ 50 ]
有一个表
+--+--+--+--+--+-----+
|序|01|02|03|04|.....|
+--+--+--+--+--+-----+
|值|17|15|18|14|.....|
+--+--+--+--+--+-----+

我用的是MySQL

stoneme 发表于 2004-3-6 21:57:41

我认为没有

道理有:
1,干什么的东西就是干什么的,SQL(结构化查询语言)是用来处理2维关系的
2,以上的数据结构是链表,你应该用处理链表的方法去处理,简单说就是编程.
3,锅是做饭的,勺是吃饭的不能反过来
3.1明白了吗?

wsm 发表于 2004-3-9 09:59:29

也许你写个暴复杂的udf可以做这件事情 不过......有点吃饱了撑的

jiangtao9999 发表于 2004-3-9 19:05:33

我现在只想到了,但和SQL无关:

获取按编号排列的数据。
从第一个开始累加水桶容量,没超过就读取下一个数据。直到超过(或等于)为止。
这样读取过的数据所代表的人打到了水。

tryso 发表于 2004-3-15 10:52:40

这两天查找了 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]
查看完整版本: 有没有高效的SQL语句能解决下面的问题?谢谢!!