我需要一个查询,该查询将包含日期,用户名和该日期的十二个operation_id之一。例如
operations
"id";"name";
"1";"LASER CUTTING"
"2";"DEBURR"
"3";"MACHINING"
"4";"BENDING"
"5";"PEM"
"6";"WELDING"
"7";"PAINT PREPARATION"
"8";"PAINTING"
"9";"SILKSCREEN PREPARATION"
"10";"SILKSCREEN"
"11";"ASSEMBLY - PACKAGING"
"12";"LASER PREP";
和用户表
bob
jimmeh
jimbo
我在这些表之间有一个交叉连接来得到这样的东西:
bob 1
bob 2
bob 3
bob 4
bob 5
bob 6
bob 7
bob 8
bob 9
bob 10
bob 11
bob 12
jimmeh 1
jimmeh 2
jimmeh 3
jimmeh 4
jimmeh 5
jimmeh 6
jimmeh 7
jimmeh 8
jimmeh 9
jimmeh 10
jimmeh 11
jimmeh 12
jimbo 1
jimbo 2
jimbo 3
jimbo 4
jimbo 5
jimbo 6
jimbo 7
jimbo 8
jimbo 9
jimbo 10
jimbo 11
jimbo 12
但我也想在2011年1月1日到现在之间每天进行交叉加入,以便我可以使用此查询为每个人每天的每个操作记录一次,以便我可以将它放在一个支点表,然后使用它为每个操作的每个用户驱动每周的报告。
截至目前,我有一个来自db.users join操作的简单select userid,其中departmentid = 8
我试过了:
select
userid,
first_name,
last_name,
operations.id,
operations.name
from
protocase.tblusers
join
operations
join
select (BETWEEN "2011-01-01" and NOW())
where
departmentid = 8 and
protocase.tblusers.active = 1
类似于如何选择(1,2,3)或其他不是来自桌子的东西,但我似乎无法弄清楚如何选择1月1日到现在之间的所有日期。这甚至可能吗?
答案 0 :(得分:1)
您可以创建类似此http://www.techrepublic.com/blog/datacenter/simplify-sql-server-2005-queries-with-a-dates-table/326
的日期表编辑:添加存储过程以生成日期:
DROP PROCEDURE IF EXISTS datePopulate;
DELIMITER $$
CREATE PROCEDURE datePopulate( startDate datetime, numDays int)
BEGIN
declare currDate datetime default startDate;
declare i int default 1;
WHILE (i<=numDays) DO
INSERT INTO DateLookup(DateFull, fullYear, weekdayname)
VALUES(currDate, date_format(currDate, '%Y'), date_format(currDate, '%a'));
SET i = i+1;
SET currDate = DATE_ADD(currDate , INTERVAL 1 DAY);
END WHILE;
END $$
DELIMITER ;
创建过程后,可以像这样调用它:
CALL datePopulate('2011-01-01', 30);
这将填写表格,从2011-01-01开始,为期30天。
我没有在insert语句中添加所有列。使用来自here的信息,应该非常直接地添加。
答案 1 :(得分:1)
最简单的方法是拥有一个预定义的表,其中包含一年中的所有日期,最多为365行。然后,您只需在查询中使用该表,仅选择2011-01-01和NOW()之间的行。这也意味着您的查询必须通过不在每次运行中创建日期表来做较少的工作。
只是另一个想法,虽然我不确定你是否需要这个。如果意图是每年都有一个日期表,例如2012年你想要一个类似的日期表,但是所有日期都是2012年,那么你可能会考虑只存储没有年份的日期和月份。
希望这是有道理的。