数据库逻辑强的请进(解题)!

fanxiaofeng19577494 2008-11-29 10:45:49
现在有一表table1,里面有date(日期)和time(时间).

比如 date time

2008/11/28 08:30:00
2008/11/28 12:30:00
2008/11/28 14:00:00
2008/11/28 18:00:00
2008/11/28 19:00:00
2008/11/28 21:00:00

2008/11/29 08:30:00
2008/11/29 12:30:00
2008/11/29 14:00:00
2008/11/29 18:00:00
2008/11/29 19:00:00
2008/11/29 21:00:00

以上是两个列,要求做成: table2

date time1 time2 time3 time4 time5 time6

2008/11/28 08:30:00 12:30:00 14:00:00 18:00:00 19:00:00 21:00:00

2008/11/29 08:30:00 12:30:00 14:00:00 18:00:00 19:00:00 21:00:00

其实就是把在table1同一个列里的时间抽出分别放在table2同一天里的六个时间列里,table1里date是可以重复的,table2里date是不能重复的,还要抽出table1同一天的六个时间按早到晚分别插入table2里六个时间里,两个表都有ID,因数据太多,总不能手工一个一个粘贴过去吧,是用mysql和php做的,只要把结果弄对就可以了,大家支支招吧!


...全文
1831 点赞 收藏 29
写回复
29 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
因为集合是键值的,又是二维的,还望大家帮给代码写出!
回复
chenping1984 2008-12-02
如果一定要实现这样的话.即使做出来了 效率也很低的(不过可以试试的). 下面代码不知道可以不可以
if($value[0]>="00:00"&&$value[0] <"08:00")
{
//首先查出上一天的最大时间
$maxtime = 'select fingertime6 from attandance_09_2008 where time='.($logtime[0]-1);
//$maxtime['fingertime6']就是最大时间 然后在更新下面的 应该就可以了.
$update="update attandance_09_2008 set fingertime1='$value[1]',fingertime2='$value[2]',fingertime3='$value[3]',fingertime4='$value[4]',fingertime5='$value[5]',fingertime6='$value[6]' where sid=".$row['id']." and DATE='".$logtime[0]."'";//


}
看了上面的代码 太复杂了 while里面 嵌套 着查询 插入 更新 还在来个 foreach里面的更新.
建议重新思考个做法. 更优的达到效果
回复
penglewen 2008-12-02
你的$array是个二维数组。所以再对$array再foreach一次,才能出来.
print_r($array)在foreach前面把数组输出,你就可以看清楚他的结构
回复
while($row=mysql_fetch_array($rs)){

$sid=$row['id'];echo $sid; //這裏是sid

$logtime=explode(" ",$row['logtime']);

$array[$logtime[0]][$sid]=$logtime[1]; //sid放到array里
}

$search="select * from attandance_09_2008 where sid=".$sid." and DATE='".$logtime[0]."'";




$num=mysql_num_rows(mysql_query($search));
if($num==""){

foreach($array as $key=>$value){

$sql2="insert into attandance_09_2008(sid,date,fingertime1,fingertime2,fingertime3,fingertime4,fingertime5,fingertime6)
value('这里','$key','$value[0]','$value[1]','$value[2]','$value[3]','$value[4]','$value[5]')";

mysql_query($sql2);
} //insert语句values里的sid怎样放呢!如果放$sid也不对呀,不太了解php,还望再指出呀!


}
回复

while($row=mysql_fetch_array($rs)){

$logtime=explode(" ",$row['logtime']);


$array[$logtime[0]][]=$logtime[1];
$search="select * from attandance_09_2008 where sid=".$row['id']." and DATE='".$logtime[0]."'";

$num=mysql_num_rows(mysql_query($search));

if($num==0){

$insert="insert into attandance_09_2008(sid,DATE,fingertime1,fingertime2,fingertime3,fingertime4,fingertime5,fingertime6) values(".$row['id'].",'".$logtime[0]."','".$logtime[1]."','0','0','0','0','0')";

mysql_query($insert);
}else
{
foreach($array as $key=>$value){

if($value[0]>="00:00"&&$value[0]<"08:00")
{
//因为这里如果跨天(就是凌晨00:00:00以后)会刷到下一天里,会在下一天里第一个显示这个跨天的记录,這裏是判断.现在就是如果第一条记录是跨天的话就让它补到前一天的最后一个时间里,再让本天里的每个时间往前移一下,下面个更新语句只能把,第一个记录是跨天的话,让本天的每个时间往前更新,可是怎么把第一个跨天的记录$value[0]增加到上一天的最后一个时间里呢!
$update="update attandance_09_2008 set fingertime1='$value[1]',fingertime2='$value[2]',fingertime3='$value[3]',fingertime4='$value[4]',fingertime5='$value[5]',fingertime6='$value[6]' where sid=".$row['id']." and DATE='".$logtime[0]."'";//符合条件的,每个时间往前移一下,可是第一个移走的时间怎么补到上一条记录的最后一个时间里呢!

}else
{
$update="update attandance_09_2008 set fingertime1='$value[0]',fingertime2='$value[1]',fingertime3='$value[2]',fingertime4='$value[3]',fingertime5='$value[4]',fingertime6='$value[5]' where sid=".$row['id']." and DATE='".$logtime[0]."'";
}


}


mysql_query($update);
}

}
如有不解其意,可看10楼14楼代码注释
回复
chenping1984 2008-12-02
你这边的表
是 table1里面的6个值组合成 一个table2里面的一个数据
所以 sid 就不能这样做的。。
可能你一开始构思有的错误了。
回复
chenping1984 2008-12-01
放在while外面时候,SID实际上那个时候就可以保存在数组中了
例如:
$rs=mysql_query($sql);
$array = array();
while($row=mysql_fetch_array($rs){
$array[$row['date']][$row['sid']] = $row['time'] ;
}
这样得到的结果就是:1,2 8分别是每段时间的 sid
array([2008/11/28]=>array
(
'1' => 'time1',
'2' => 'time2',
..
'8 => ''time8,
),[2008/11/29]=>array('1' => 'time1',
'9 => 'time2',
..
'20=> ''time8,);
这样用foreach 就可以了
回复
引用16楼的,如果把foreach放在while外面,那sid怎么取呢,它只会取第一个记录的,用数组在while里就可以取到每个sid,放到外面的foreach里的insert语句里遍历出来的是第一个sid呀,就是说怎么把所有的sid取到放到foreach里!



18楼的方法可不可以写具体点,多谢了!
回复
jumpheightway 2008-12-01
排个序问题就解决了
回复
foolbirdflyfirst 2008-12-01
然后foreach 一下,做个sql字符串出来.
回复
foolbirdflyfirst 2008-12-01
$rs[0]['date'] = '2008/11/28 '
$rs[0]['time1'] = '时间1';
$rs[0]['time2'] = '时间2';
...
...
..
$rs[1]['date'] = '2008/11/29 '
$rs[1]['time1'] = '时间1';
$rs[1]['time2'] = '时间2';
...
...
...
回复
foolbirdflyfirst 2008-12-01
mysql的话有个group_concat函数,为什么不用.php要做的只是将结果数组重新构造一下.
mysql
========
$sql = "select `date`,group_concat(`time`) as ctime from table1 where 1 group by `date`";

php
=================================================
explode(',',时间串),array_unique一下,构造成一个类似以下的数组

$rs[0]['date'] = '2008/11/28 '
$rs[0]['time1'] = '时间1';
$rs[0]['time2'] = '时间2';

回复
chenping1984 2008-12-01
你在测试的时候
最好 先把 保存的数据
print_r();
输出 看看格式是什么样的
回复
chenping1984 2008-12-01
本来只有58条的记录,现在是插入1650条了
首先把结果给查询出来的
你不能 查询出一个结果 然后 foreach() 当然会出现很多了

while($row=mysql_fetch_array($rs)){

$sid=$row['id']; //把_staffinfo里的id赋给变量
$logtime=explode(" ",$row['logtime']); //因为时间是2008-11-28 08:30:00格式的,所以要截取: $logtime[0]截取的是2008-11-28就是年月日 ,$logtime[1]截取的是08:30:00就是时分秒

$search="select * from attandance_09_2008 where sid=".$sid." and DATE='".$logtime[0]."'"; //这句就是要插入六个时间的表,先查出符合条件的然后插入

$num=mysql_num_rows(mysql_query($search));

$array[$logtime[0]][]=$logtime[1];

if($num==0){//如果查出记录为0的就插入,否则就更新

foreach($array as $key=>$value){
$sql2="";
$sql2="insert into attandance_09_2008(sid,date,fingertime1,fingertime2,fingertime3,fingertime4,fingertime5,fingertime6)
value('$sid','$key','$value[1]','$value[2]','$value[3]','$value[4]','$value[5]','$value[6]')"; //這裏的sql用單引號不行啊,會有錯
mysql_query($sql2);
}

}

这边的foreach 要想办法放到 while外面去呢 。
要不然会一直循环的。
回复
chenping1984 2008-12-01
有的时间没插进去是因为索引是从0开始的
所以 $sql2="insert into attandance_09_2008(sid,date,fingertime1,fingertime2,fingertime3,fingertime4,fingertime5,fingertime6)
value('$sid','$key','$value[1]','$value[2]','$value[3]','$value[4]','$value[5]','$value[6]')";
这要改成:
$sql2="insert into attandance_09_2008(sid,date,fingertime1,fingertime2,fingertime3,fingertime4,fingertime5,fingertime6)
value('$sid','$key','$value[0]','$value[1]','$value[2]','$value[3]','$value[4]','$value[5]')";
回复
falsetable表里只有卡号和时间,并且时间己经升序排列和group了

$sql="SELECT _staffinfo.id,falsetable.logtime FROM _staffinfo , falsetable where _staffinfo.staffid=falsetable.userid ";查询_staffinfo里的id,条件是两个表里的卡号相同

$array = array();

$rs=mysql_query($sql);
$count=mysql_num_rows($rs);

while($row=mysql_fetch_array($rs)){

$sid=$row['id']; //把_staffinfo里的id赋给变量
$logtime=explode(" ",$row['logtime']); //因为时间是2008-11-28 08:30:00格式的,所以要截取: $logtime[0]截取的是2008-11-28就是年月日 ,$logtime[1]截取的是08:30:00就是时分秒

$search="select * from attandance_09_2008 where sid=".$sid." and DATE='".$logtime[0]."'"; //这句就是要插入六个时间的表,先查出符合条件的然后插入

$num=mysql_num_rows(mysql_query($search));

$array[$logtime[0]][]=$logtime[1];

if($num==0){//如果查出记录为0的就插入,否则就更新

foreach($array as $key=>$value){
$sql2="";
$sql2="insert into attandance_09_2008(sid,date,fingertime1,fingertime2,fingertime3,fingertime4,fingertime5,fingertime6)
value('$sid','$key','$value[1]','$value[2]','$value[3]','$value[4]','$value[5]','$value[6]')"; //這裏的sql用單引號不行啊,會有錯
mysql_query($sql2);
}

}}



现在会重复的插入记录,本来只有58条的记录,现在是插入1650条了,而且后面五个时间有的还是没有插进去,好郁闷呀!




回复
penglewen 2008-11-29
[Quote=引用 4 楼 fanxiaofeng19577494 的回复:]
二楼的方法只能根据固定死的时间查,还是谢了,还有办法么!最好用php+mysql的语句比较好做一点
[/Quote]
你可以先取出时间来,再拼SQL语句

SELECT time FROM t GROUP BY time 这样就取出了时间然后用while来取出时间
$sql = 'select date,';
$i = 1;
while($value = fetch_array($query)){
$sql .= "((case `time` when '".$value['time']."' then `time` else null end) as time".$i.",)";
$i++;
}

$sql .=' from t1 group by date';
回复
fxs_2008 2008-11-29


//给你写一个吧



$sql="select distinct date from table oder by date ";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)({
$sql1="select * from table where date=".$row['date'] order by time;
$result1=mysql_query($sql1);

$i=0
while($row1=mysql_fetch_array($result1)){
$i++;
if($i=1){

$sql2="insert into table2 (date,time1,time2,time3,time4,time5) values ('".$row['date']."','"$row1['time']."','0','0','0','0')"; //日期型是否加隐号不知道

}else{
$sql2="update table2 set time".$i." =".$row1['time']." where date='".$row['date']."'";
}
mysql_query($sql2);

}

}




回复
fxs_2008 2008-11-29
将日期提取出来,循环日期,根据日期循环时间,然后这个重新插入数据库
select distinct datefield from date
取出日期,,然后根据日期再取出时间
回复
二楼的方法只能根据固定死的时间查,还是谢了,还有办法么!最好用php+mysql的语句比较好做一点
回复
加载更多回复
相关推荐
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2008-11-29 10:45
社区公告
暂无公告