小春网

 找回密码
 注册账号
查看: 1211|回复: 10
收起左侧

[IT 交流] 想请教mysql和p(php or perl)的一个算法的问题

[复制链接]
发表于 2012-10-2 11:33:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

x
有三个表ABC 先把A10月的x列的数值取出和B表的z列的数值比较,
如果A表的10月的x列的数值等于B表的z列的数值的情况下,
        A表的10月的x列和y列插入C表,
如果A表的10月的x列的数值小于B表的z列的数值的情况下,
        A表的9月的x列取出和A表的10月的x列相加,再和B表的z列比较
如果A表的10月和9月的x列的数值的和仍然小于B表的z列的数值的情况下,
        在把A表的9月的x列取出和A表的9月,10月的x列相加
以此类推,直到A表的x列的和与B表的z列的数值相等为止,
        然后再把A表中从10月到计算出的那个月的各项值插入到C
    無題.jpg

我想的方法是
Select * from B; 得到 $z = 18;
Ax列为$sum = 0;
$i = 0; // mysql计算前一个月用
While ($sum < $z) {
  Select * from A where y = date_sub(10,interval $i month);
  foreach (执行这个sql所得到的结果){
    $sum = x列的值;
  }
  $i += 1;
  If ($sum == $z){
    foreach (执行这个sql所得到的结果){
      insert into C values (A表各列的值)
    }
  }
}
但是因为要把mysql的结果循环两遍,所以觉得有些浪费,而且A表特别大,大到要分partion
想问问大家有没有更好的方法?


 楼主| 发表于 2012-10-2 15:34:14 | 显示全部楼层
没有人吗???
回复

使用道具 举报

发表于 2012-10-2 16:08:44 | 显示全部楼层
你的问题看得我头晕,读了2遍迷糊了。
回复

使用道具 举报

 楼主| 发表于 2012-10-2 16:21:20 | 显示全部楼层
snowman1101 发表于 2012-10-2 16:08
你的问题看得我头晕,读了2遍迷糊了。

呵呵 不好意思 语言表达能力比较差
回复

使用道具 举报

发表于 2012-10-2 17:12:29 | 显示全部楼层
本帖最后由 snowman1101 于 2012-10-2 17:16 编辑

自己整理了下,你看看是不是这个意思,不明白 你那  8月,7月是干什么的

  1. if  (SheetA->10.X列 == SheetB->Z列)

  2.      insert into C values

  3. else if(SheetA->10.X列 < SheetB->Z列)
  4. {
  5.    if ( (SheetA->9.X列 + SheetA->10.X列) < SheetB->Z列)
  6.        {
  7.         if ((SheetA->9.X列 + SheetA->9.X列 + SheetA->10.X列) < SheetB->Z列)
  8.                    ...
  9.         }
  10. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2012-10-2 18:21:33 | 显示全部楼层
snowman1101 发表于 2012-10-2 17:12
自己整理了下,你看看是不是这个意思,不明白 你那  8月,7月是干什么的

对,大概就是这个意思,不过有一点不对,
10.        if ((SheetA->9.X列 + SheetA->9.X列 + SheetA->10.X列) < SheetB->Z列)) 改成
10.        if ((SheetA->8.X列 + SheetA->9.X列 + SheetA->10.X列) < SheetB->Z列))
                 {
                      if ((SheetA->7.X列 + SheetA->8.X列 + SheetA->9.X列 + SheetA->10.X列) < SheetB->Z列))
                        。。。

                }
                   }
回复

使用道具 举报

 楼主| 发表于 2012-10-2 18:22:32 | 显示全部楼层
snowman1101 发表于 2012-10-2 17:12
自己整理了下,你看看是不是这个意思,不明白 你那  8月,7月是干什么的

这样一直循环下去,直到找到相等的为止
回复

使用道具 举报

发表于 2012-10-2 18:48:28 | 显示全部楼层
yunkai 发表于 2012-10-2 18:22
这样一直循环下去,直到找到相等的为止

我说看着迷糊呢 和你的代码一点对不上号

  在把A表的9月的x列取出和A表的9月,10月的x列相加
下班回家了。。。。
回复

使用道具 举报

发表于 2012-10-3 11:49:20 | 显示全部楼层
本帖最后由 hina1115 于 2012-10-3 11:51 编辑

2个问题
1)  A.x 如果
4 10月
5 9月
3 8月
7 7月
---------
相加之后没有等于 18而是直接大约18的话,应该会形成死循环。


2)循环到相等之后,是要退出函数还是要从新开始。
如果是退出函数,if 里面的 foreach没有必要。
如果是重新开始,你写的 伪代码 应该不对。
回复

使用道具 举报

发表于 2013-11-22 17:02:05 | 显示全部楼层
我是这么想的, 你不是先有了下面的东西嘛.
4 10月 
5 9月 
3 8月 
6 7月 
根据题意, 我觉得你先生成下面的东西
4 10月 4
5 9月 9
3 8月 12
6 7月 18
第三列的生成规则,你知道吧? 这个步骤算一个循环,
然后拿出B表中的数,放到刚才生成的表中,和第三列的数比较大小.
找到相应的数时, 表中剩下的数就不用继续比了.
剩下的你应该知道怎么做了.
这样下来你看会不会简单些?
回复

使用道具 举报

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

本版积分规则

小春网
常务客服微信
微信订阅号
手机客户端
扫一扫,查看更方便! 快速回复 返回顶部 返回列表