Mysql使用多个where和join操作插入查询

时间:2016-06-11 18:12:09

标签: php mysql inner-join

需要在表格public_holidays中插入与假日表日期匹配的给定日期,它应该与CLOCK表clock_in和clock_out时间字段匹配,并且在28800 = 8小时内以秒为单位获取时间差,并且还需要匹配来自用户的指定表表user_id,对不起代码非常混乱,大大困惑任何帮助都非常有用,谢谢。

时钟表

id  user_id     date        clock_in                clock_out             created_at          updated_at
6     12     2016-06-10  2016-06-10 06:00:00    2016-06-10 14:00:00   2016-06-10 19:20:41   2016-06-10 00:15:51

用户

 id         first_name      last_name    designation_id   email
  1          crysis            name           1          crysis@gmail.com

假期

id    date       holiday_description    created_at         updated_at
1    2016-06-10      christmas      2016-06-11 15:23:54   2016-06-11 15:23:54

指定

designation_id  department_id   designation     created_at       updated_at
1                 1              employee   2016-01-30 21:03:24 2016-01-30 22:03:24

department_id   department_name  department_description     created_at            updated_at    
   1                IT             Info tech             2016-01-30 21:03:24       2016-01-30 21:03:24

需要通过计算时钟表中的时间8小时以下格式插入此表Public_holidays

user_id     department_id   designation_id  date_cur       clock_in         clock_out        created_at                   updated_at
  12            1                1         2016-06-13   2016-06-10 06:00:00 2016-06-10 14:00:00   2016-06-13 21:03:24       2016-06-13 21:03:24

尝试凌乱的代码

INSERT INTO public_holidays (user_id, department_id,designation_id,clock_in,clock_out) SELECT(cl.user_id, 
   di.department_id, 
   di.designation_id,
   cl.clock_in,
   cl.clock_out)
FROM clock cl, designations di
where
(
select h1.date AS ph_date from holidays h1 WHERE ph_date = 2015-01-22
  AND
select (TIMESTAMPDIFF(second,cl.clock_in, cl.clock_out)=28800) AS differ1
AND
INNER JOIN users AS ui ON ui.designation_id = di.id 
);

2 个答案:

答案 0 :(得分:1)

我仍然没有理解,但至少看到了一些关系。下面的查询将返回所有员工的数据集以及每个员工的所有假期(h.date列应该进入cur_date表)。最后JOIN没有关系,因此它创建了笛卡尔积 - 为每个已构造的行附加每个假期(总行数= nuber of empl x假期数)

SELECT cl.user_id, di.department_id, di.designation_id, h.date, cl.clock_in, cl.clock_out
FROM clock cl
INNER JOIN users u ON cl.user_id = u.user_id
INNER JOIN designation di ON u.designation_id = u.user_id
CROSS JOIN holidays h --cartesian product: all dates for each row
  • 不知道clock表是什么 - 标准工作时间(每个员工一行 - 我认为这是真的),每日时间表(每个员工每个日期一行)还是其他?如果是标准工作时间,那么为什么datetime而不是time?如果它的每日时间表我应该如何决定你选择哪个8小时(为什么8小时)?
  • 不知道你为什么计算/搜索这8小时 - 你想为empl插入假期吗?仅工作8小时(根据"时钟" /在任何一天)
  • 不知道cur_date是什么(假设是假期),但为什么在date旁边使用datetime - 不应该是time或仅datedatetime

答案 1 :(得分:0)

最后这个工作@shudder谢谢你的帮助

INSERT INTO public_holidays (user_id, department_id,designation_id,date_cur,clock_in,clock_out)
SELECT cl.user_id, des.department_id , us.designation_id, cl.date,cl.clock_in, cl.clock_out 

FROM clock cl 

INNER JOIN holidays AS hol ON hol.date = cl.date

INNER JOIN users AS us ON cl.user_id = us.id

INNER JOIN designations AS des ON des.id = us.designation_id

WHERE date(cl.created_at) = '2016-06-13'

AND TIMESTAMPDIFF(second,cl.clock_in, cl.clock_out) = 28800;