MySql在同一查询中对多个时间戳查询进行分组
我正在尝试编写一个MySQL函数,该函数将使我能够在设定的时间段(即1天、1周、1个月等)内汇总工作人员完成的工作量。完成的每项工作在数据库中生成1个ID条目 条目的日期设置为时间戳 我的问题是,我不清楚我将如何对数据库进行多次调用,以检查在设置的时间戳期间有多少条记录 下面是数据库表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
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。请你解释一下。谢谢你的帮助。只举两种方法的例子。假装它们是“这边或这边”