MySql在同一查询中对多个时间戳查询进行分组

MySql在同一查询中对多个时间戳查询进行分组,mysql,datetime,unix-timestamp,Mysql,Datetime,Unix Timestamp,我正在尝试编写一个MySQL函数,该函数将使我能够在设定的时间段(即1天、1周、1个月等)内汇总工作人员完成的工作量。完成的每项工作在数据库中生成1个ID条目 条目的日期设置为时间戳 我的问题是,我不清楚我将如何对数据库进行多次调用,以检查在设置的时间戳期间有多少条记录 下面是数据库表 CREATE TABLE staffwork( staff_id MEDIUMINT UNSIGNED NOT NULL, id_of_work_inserted MEDIUMINT UNSIGNED NO

我正在尝试编写一个MySQL函数,该函数将使我能够在设定的时间段(即1天、1周、1个月等)内汇总工作人员完成的工作量。完成的每项工作在数据库中生成1个ID条目

条目的日期设置为时间戳

我的问题是,我不清楚我将如何对数据库进行多次调用,以检查在设置的时间戳期间有多少条记录

下面是数据库表

CREATE TABLE staffwork(
staff_id MEDIUMINT UNSIGNED NOT NULL, 


id_of_work_inserted MEDIUMINT UNSIGNED NOT NULL,
job_id MEDIUMINT UNSIGNED NOT NULL,

data_table VARCHAR (65) NOT NULL, 
entrytime int(11) NOT NULL, 

INDEX message (staff_id) 


); 
下面是将数据放入表中的查询,即时间戳:

INSERT INTO staffwork
 (staff_id, job_id, id_of_work_inserted, data_table,  entrytime )
VALUES ('$staff_id', '$job_id', '$id_of_job', '$data_table', UNIX_TIMESTAMP(now()) )";      
SELECT 
            COUNT(job_id) AS totalWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
SELECT 
            COUNT(job_id) AS oneDaysWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 day    
SELECT 
            COUNT(job_id) AS oneWeekWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 week
SELECT 
            COUNT(job_id) AS oneMonthWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 month
下面是我的SQL函数:

CREATE TABLE staffwork(
staff_id MEDIUMINT UNSIGNED NOT NULL, 


id_of_work_inserted MEDIUMINT UNSIGNED NOT NULL,
job_id MEDIUMINT UNSIGNED NOT NULL,

data_table VARCHAR (65) NOT NULL, 
entrytime int(11) NOT NULL, 

INDEX message (staff_id) 


); 
功能statsForEmployeesWork($staff\U id) { 全球$dbc

$select = " SELECT 
                COUNT(job_id) AS totalWorkDone,
                COUNT(job_id) AS oneDaysWorkDone,
                COUNT(job_id) AS oneWeekWorkDone,
                COUNT(job_id) AS oneMonthWorkDone
                ";

$from   = " FROM 
            staffwork 
                ";

$where = " WHERE
                 staff_id = '$staff_id
               AND  
                  entrytime  >= now() - interval '1 day'     
               AND 
                  entrytime  >= now() - interval '1 week'
               AND
                  entrytime  >= now() - interval '1 month '";    

$query  = $select.$from. $where;

$result = mysqli_query ($dbc, $query)

    return $result ; 
} 

我非常感谢您在这方面提供的帮助和建议。

您的entrytime字段是一个int,这意味着您不能使用直接的mysql日期数学,您最终将执行以下操作

12345678 > '2013-11-14'
这是没有意义的。请将日期范围转换为整数,或将整数字段转换为正常日期:

WHERE FROM_UNIXTIME(entrytime) >= now() - interval 1 day
WHERE entrytime >= UNIX_TIMESTAMP(now() - interval 1 day)
更好的方法是,将entrytime转换为实际的datetime字段,然后原始查询将按预期工作。

在本子句中

              entrytime  >= now() - interval '1 day'     
           AND 
              entrytime  >= now() - interval '1 week'
           AND
              entrytime  >= now() - interval '1 month
第一个表达式将丢弃所有大于1天的条目

            COUNT(job_id) AS totalWorkDone,
            COUNT(job_id) AS oneDaysWorkDone,
            COUNT(job_id) AS oneWeekWorkDone,
            COUNT(job_id) AS oneMonthWorkDone
都是一样的

您应该拆分查询以分别计算每个期间:

totalWorkDone:

INSERT INTO staffwork
 (staff_id, job_id, id_of_work_inserted, data_table,  entrytime )
VALUES ('$staff_id', '$job_id', '$id_of_job', '$data_table', UNIX_TIMESTAMP(now()) )";      
SELECT 
            COUNT(job_id) AS totalWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
SELECT 
            COUNT(job_id) AS oneDaysWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 day    
SELECT 
            COUNT(job_id) AS oneWeekWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 week
SELECT 
            COUNT(job_id) AS oneMonthWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 month
oneDaysWorkDone:

INSERT INTO staffwork
 (staff_id, job_id, id_of_work_inserted, data_table,  entrytime )
VALUES ('$staff_id', '$job_id', '$id_of_job', '$data_table', UNIX_TIMESTAMP(now()) )";      
SELECT 
            COUNT(job_id) AS totalWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
SELECT 
            COUNT(job_id) AS oneDaysWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 day    
SELECT 
            COUNT(job_id) AS oneWeekWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 week
SELECT 
            COUNT(job_id) AS oneMonthWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 month
oneWeekWorkDone:

INSERT INTO staffwork
 (staff_id, job_id, id_of_work_inserted, data_table,  entrytime )
VALUES ('$staff_id', '$job_id', '$id_of_job', '$data_table', UNIX_TIMESTAMP(now()) )";      
SELECT 
            COUNT(job_id) AS totalWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
SELECT 
            COUNT(job_id) AS oneDaysWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 day    
SELECT 
            COUNT(job_id) AS oneWeekWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 week
SELECT 
            COUNT(job_id) AS oneMonthWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 month
oneMonthWorkDone:

INSERT INTO staffwork
 (staff_id, job_id, id_of_work_inserted, data_table,  entrytime )
VALUES ('$staff_id', '$job_id', '$id_of_job', '$data_table', UNIX_TIMESTAMP(now()) )";      
SELECT 
            COUNT(job_id) AS totalWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
SELECT 
            COUNT(job_id) AS oneDaysWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 day    
SELECT 
            COUNT(job_id) AS oneWeekWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 week
SELECT 
            COUNT(job_id) AS oneMonthWorkDone

       FROM 
        staffwork 

       WHERE
             staff_id = $staff_id
           AND  
              entrytime  >= now() - interval 1 month

当然,将
entrytime
转换为
datetime
字段

你好,克劳斯特罗福,谢谢你的回复。我不清楚。然后我是否要执行3个单独的SQL函数来获取数据。2.你是指如何将entrytime转换为datetime字段的。我该怎么做你好,非常感谢你的回复。我有点困惑为什么你在查询中做了两个WHERE cluase。请你解释一下。谢谢你的帮助。只举两种方法的例子。假装它们是“这边或这边”