QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1225|回复: 4

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

[复制链接]
发表于 2004-3-4 10:13:29 | 显示全部楼层 |阅读模式
题:有一水缸(知道里面有50升水),有10几个人排着队去分水,他们桶的大小都不一样,有的17升,有的15升...

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

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

我用的是MySQL
发表于 2004-3-6 21:57:41 | 显示全部楼层
我认为没有

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

使用道具 举报

发表于 2004-3-9 09:59:29 | 显示全部楼层
也许你写个暴复杂的udf可以做这件事情 不过......有点吃饱了撑的
回复

使用道具 举报

发表于 2004-3-9 19:05:33 | 显示全部楼层
我现在只想到了,但和SQL无关:

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

使用道具 举报

 楼主| 发表于 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个人分得水
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 09:28 , Processed in 0.051876 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表