2012-09-05 36 views
2

我有以下格式的机器的mysql日志表。如何从两个连续的行中找到两个字段的区别?

 --------------------------------------------------------------------------------------------------- 
    | Event_Id | Event_Type | Machine_No | Operator | Time Stamp   | Shift | Reason  | Count | 
    --------------------------------------------------------------------------------------------------- 
    | 101  | Up   | Machine1 | operator1 | 2012-06-09 01:03:55 | S1 | Start  | 1  | 
    | 102  | Up   | Machine2 | operator2 | 2012-06-09 01:03:55 | S1 | Start  | 1  | 
    | 103  | Up   | Machine3 | operator3 | 2012-06-09 01:03:55 | S1 | Start  | 1  | 
    | 104  | Down  | Machine1 | operator1 | 2012-06-09 02:03:55 | S1 | Break Down | 1  | 
    | 101  | Up   | Machine1 | operator1 | 2012-06-09 02:33:55 | S1 | After BD | 1  | 
    --------------------------------------------------------------------------------------------------- 

表格就这样下去。

通过传递以下查询。

$data = mysql_query("SELECT * FROM rpt_machine_log WHERE machine='machine1' AND shift='Shift1'") 

我能够得到以下输出。

101 Up  machine1 operator1 2012-06-09 01:03:55 Shift1 Start of The Shift 1 
106 Down machine1 operator1 2012-06-09 03:15:55 Shift1 Break    1 
109 Up  machine1 operator1 2012-06-09 03:30:55 Shift1 After The Break  1 
112 Down machine1 operator1 2012-06-09 03:45:55 Shift1 Break Down   1 
115 Up  machine1 operator1 2012-06-09 05:00:55 Shift1 After Break Down 1 
116 Down machine1 operator1 2012-06-09 05:30:55 Shift1 Break Down   2 
117 Up  machine1 operator1 2012-06-09 05:45:55 Shift1 After Break Down 2 
118 Down machine1 operator1 2012-06-09 06:00:55 Shift1 End of Shift  1 

现在我想找到在php代码中每个连续的上升和下降时间的差异。

我也想SHIFT2添加到相同的查询,显示MACHINE1日志都转向1 & 2.

因为我是新来的PHP时我没能解决这个问题。

任何帮助我。

+5

一些建议。 1)你可能想要添加一个命令到你的查询来保证顺序,2)你应该研究[foreach](http://php.net/manual/en/control-structures.foreach.php)循环遍历$ data,3)你不应该使用mysql_query,而应该使用mysqli_query,因为前者的使用不受欢迎 – ernie

+0

谁创建了你的日志表?什么是PK? – Kermit

回答

2

要获得SHIFT2藏汉我会怎么做:

SELECT * 
FROM rpt_machine_log 
WHERE machine='machine1' AND (shift='Shift1' OR shift='Shift2') 
ORDER BY shift,`Time Stamp` 

通过使用具有要添加`他们周围空格或特殊字符列。说实话,为所有专栏做这件事更安全。某些列(如Add)会导致查询失败,因为add是sql中的保留关键字。

如果你能保证了会一直跟着下来,那么你可以遍历的结果: while($row=mysql_fetch_assoc($data)){}

在此之后有很多的方法去存储数据,可以尝试:

if(isset($timestamp)){ 
$difftime=strtotime($row['Time Stamp'])-strtotime($timestamp); 
$hours=floor($difftime/3600); 
$difftime-=$hours*3600; 
$minutes=floor($difftime/60); 
$difftime-=$minutes*60; 
$seconds=$difftime; 
$diff_array[]=$hours.":".$minutes.":".$seconds; 
unset($timestamp);} 
else{ 
$timestamp=$row['Time Stamp'];} 

在那里你有一个所有时间差异的数组。

显然,如果你不能保证up会总是在下来之后出现,或者你想分开shift1和shift2的时间差异,那么你将不得不在while循环中增加额外的检查。

---编辑---

if(isset($timestamp)){ 
$difftime=strtotime($row['Time Stamp'])-strtotime($timestamp); 
$diff_array[]=$difftime; 
unset($timestamp);} 
else{ 
$timestamp=$row['Time Stamp'];} 

foreach ($diff_array as &$value){ 
$Uptime += $value;} 

$hours=floor($Uptime/3600); 
$Uptime-=$hours*3600; 
$minutes=floor($Uptime/60); 
$Uptime-=$minutes*60; 
$seconds=$convert; 
$Uptime=$hours.":".$minutes.":".$seconds; 

--- EDIT2 ---

while($row=mysql_fetch_assoc($data)){ 
$array['event_type'][]=$row['event_type']; 
$array['timestamp'][]=$row['Time Stamp'];} 

现在你有两个数组的数组:event_types和时间戳。如果你想要的话,你也可以把它做成两个不同的数组。 $event_type[]=$row['event_type'];并相应地更改其余部分。

您现在可以执行for循环来遍历这些结果并执行所需的检查。

$count=count($array['event_type']); 
for($x=0;$x<$count;$x++){ 
if($row['event_type'][$x]=='Down' && $row['event_type'][$x+1]=='Up'){ 
}} 

记得以前的计算计数循环,把它作为其中一个条件意味着它会计算每一次,因此具有性能成本。

此外,如果您想跳过mysql结果的第一个结果,请在while循环之前调用$row=mysql_fetch_assoc($data)一次。

+0

非常感谢mrmryb。它的效果很好。但我有一个疑问。如果表格值以down开头,那么它会起作用吗?我也想分割shift1和shift2的时差。 – Allen

+1

这就是为什么我说你必须保证这个方法的顺序,但是在查询结束时使用'ORDER BY TIME STAMP',你总是会在稍后的时间到来,下订单。 ($ time ['Time Stamp']) - strtotime($ timestamp);''到'$ difftime = strtotime($ timestamp)-strtotime($($ timestamp)-strtotime($ timestamp))如果您确实想按先后顺序排序,行['时间戳']);'应该做的伎俩。这一切都取决于订单,如果你想保持灵活性,那么你需要开始添加支票。 – mrmryb

+0

分离shift1和shift2没有任何ifs的最简单的方法是创建数组,基于哪个变量通过将值转换为变量名'$ {$ row ['Shift']} [] = $ hours“。 :“。$分钟。”:“。$秒;'然后你有两个数组,$ shift1和$ shift2 – mrmryb

0

您也可以通过回到表格完全在MySQL中完成此操作。像这样的(未经测试)代码的东西应该工作:

SELECT * 
FROM rpt_machine_log rpt1, rpt_machine_log rpt2 
WHERE rpt1.event_type = "Up" 
AND rpt1.machine_no = rpt2.machine_no 
AND rpt2.`time stamp` > rpt1.`time stamp` 
AND rpt2.event_type = "Down" 

有一些极端情况,但这应该让你开始。

相关问题