首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >上传CSV文件、PHP/MySQL查询

上传CSV文件、PHP/MySQL查询
EN

Stack Overflow用户
提问于 2013-05-24 05:32:51
回答 1查看 1.2K关注 0票数 1

我有一个像这样的.csv文件.

代码语言:javascript
复制
     Name            AC-No.      Time                State        Exception   Operation

Johnny Starks Depp   1220    4/12/2013 12:45:18 AM  Check In        OK   
Johnny Starks Depp   1220    4/12/2013 5:46:58 AM   Out             Out 
Johnny Starks Depp   1220    4/12/2013 6:22:41 AM   Out Back        Out  
Johnny Starks Depp   1220    4/12/2013 10:42:17 AM  Check Out       Repeat   
Johnny Starks Depp   1220    4/12/2013 10:42:19 AM  Check Out       OK

我已经可以把这个上传到我的数据库了。我的问题是,它显示在表格中的结果。在mysql数据库中,我有一个列表(名称,ACNo )。、CheckIn、Breakout、Breakin、CheckOut)。我想要的是我不能做正确的事。.csv文件中具有相同DATE (在TIME列中显示)的记录/s将与表中的签入、BreakOut、BreakIn和CheckOut放在同一行,不会产生多条记录。像这样..。

代码语言:javascript
复制
     Name         |ACNo |     Date  | CheckIn     |  Breakout  |   Breakin  | Checkout
                  |     |           |             |            |            |
Johnny Starks Depp|1220 | 4/12/2013 | 12:45:18 AM | 5:46:58 AM | 6:22:41 AM | 10:42:19 AM

现在.。我已经在桌子上做了我想要发生的事情的例子,但是.当我检查表,是的,它有不同的日期每行,但时间(CheckIn,突破,布雷金,结帐)是错误的。错误,因为2013年12月4日的时间记录在2013年12月4日。我用的密码怎么了?或者我还能做什么?这是我的密码:

代码语言:javascript
复制
<?php

$conn = mysql_connect("localhost","root","") or die(mysql_error());
mysql_select_db("dtrlogs",$conn);

$datehere ="";

if(isset($_POST['Submit']))
{

$file = $_FILES['file']['tmp_name'];

if($file == "")
{
    ?>
    <script type="text/javascript">
    alert('No File Selected!');
    </script>
    <?php
}

else
{
$handle = fopen($file,"r");
while(($fileop = fgetcsv($handle,1000,";")) !==false)
{
    $Name = $fileop[0];
    $ACNo = $fileop[1];
    $Time = $fileop[2];
    $State = $fileop[3];
    $NewState = $fileop[4];
    $Exception = $fileop[5];
    $Operation = $fileop[6];

    //i separated time/date in the Column TIME in the .csv file
    $date = date('m/d/Y', strtotime($Time));
    $hours = date('H:i:s A', strtotime($Time));


    //this is what i used to prevent multiple dates
    if($datehere != $date) {

        $datehere = $date;
    }
    else{

        $date = "";
    }







    //this is to insert the name and acno to the other table. 
    //(this is for the lists of employee)

    $sql=mysql_query("SELECT * FROM employee Where ACNo = '$ACNo'");
    $row=mysql_fetch_array($sql);
    if($row == 0) {

       $sql1 = mysql_query("INSERT INTO employee(ACNo, Name) VALUES('$ACNo','$Name')");
    }



    //Inserts record if Date is not yet recorded and if already has just updates 
    //the row's column (Checkin, breakout, breakin and Checkout) 
    //with its correct time according to the date

    $query = mysql_query("SELECT * FROM dtrs Where ACNo = '$ACNo' AND Date = '$date'");
    $rows = mysql_fetch_array($query);
    if($rows == 0) {

    $sql2 = mysql_query("INSERT INTO dtrs(Name, ACNo, Date, CheckIn, BreakOut, 
    BreakIn,CheckOut) 
    VALUES('$Name','$ACNo','$date','$CheckIn','$Breakout','$Breakin','$Checkout')");

    }
    else{

    $sql2 = mysql_query("Update dtrs Set CheckIn = '$CheckIn', BreakOut = 
    '$Breakout', BreakIn = '$Breakin', CheckOut = '$Checkout'");
    }







    //this is my conditions to identify whether the TIME/HOUR is 
    //Stated as CheckIn, Breakout, Breakin, or Checkout

    if($NewState == "Check In" || $State == 'Check In' && $Exception == "OK") {

        if($Exception == "Invalid" || $Exception == "Repeat")
        {}
        else {
            $CheckIn = $hours;
        }
    }
    if($State == 'Out' && $Exception == "Out") {

        if($Exception == "Invalid" || $Exception == "Repeat")
        {}
        else {
            $Breakout = $hours;
        }
    }
    if($State == 'Out Back' && $Exception == "Out") {

        if($Exception == "Invalid" || $Exception == "Repeat")
        {}
        else {
            $Breakin = $hours;
        }
    }
    if($NewState == "Check Out" || $State == "Check Out" && $Exception == "OK") {

        if($NewState == "Check In")
        {}
        else {
            $Checkout = $hours;
        }
     }


}


if($sql2)
{
if($sql2)
{


?>
    <script type="text/javascript">
    alert('File Upload Successful!');
    </script>
<?php
}
}
}

}

?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-24 11:41:03

我建议可能加载到一个临时表,并从中提取用于填充真实表的详细信息。

例如,如果您将CSV文件加载到一个名为LoadTable的表(而不是临时表,因为您只能在一段SQL中使用一次临时表),则可以提取不同的名称和帐户号,然后将其与子选择连接,以获得每个相关事件的最大事件时间。

就像这样:-

代码语言:javascript
复制
SELECT DerivMain.Name, 
    DerivMain.ACNo, 
    DerivMain.EventDate, 
    DATE_FORMAT(DerivCheckIn.EventDateTime, '%l:%i:%s %p'), 
    DATE_FORMAT(DerivBreakout.EventDateTime, '%l:%i:%s %p'),  
    DATE_FORMAT(DerivBreakin.EventDateTime, '%l:%i:%s %p'), 
    DATE_FORMAT(DerivCheckout.EventDateTime, '%l:%i:%s %p')
FROM (SELECT DISTINCT Name, ACNo, DATE(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p')) As EventDate FROM LoadTable) DerivMain
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Check In' GROUP BY Name, ACNo) DerivCheckIn
ON DerivMain.Name = DerivCheckIn Name AND DerivMain.ACNo = DerivCheckIn.ACNo 
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Out' GROUP BY Name, ACNo) DerivBreakout
ON DerivMain.Name = DerivBreakout Name AND DerivMain.ACNo = DerivBreakout.ACNo 
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Out Back' GROUP BY Name, ACNo) DerivBreakin
ON DerivMain.Name = DerivBreakin Name AND DerivMain.ACNo = DerivBreakin.ACNo 
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Check Out' GROUP BY Name, ACNo) DerivCheckout
ON DerivMain.Name = DerivCheckout Name AND DerivMain.ACNo = DerivCheckout.ACNo 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16728244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档