【问题标题】:Mysql Insert query with multiple where and join operations具有多个 where 和 join 操作的 Mysql 插入查询
【发布时间】:2016-06-11 18:12:08
【问题描述】:

需要在给定日期之前插入到表 public_holidays 与假期表日期匹配,它应该匹配 CLOCK 表 clock_in 和 clock_out 时间字段并获取 28800 = 8hrs 的时间差(以秒为单位),还需要匹配用户的指定表表 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

需要通过从时钟表计算时间 8hrs 以下面的格式将 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 
);

【问题讨论】:

  • 你的代码在结构和语义上都是错误的......你应该首先从你需要的表和这些表之间的关系开始,然后定义 where 条件......最后选择列
  • MySQL 讨厌子查询,即使您要加入子查询,也要尽可能尝试加入。黄金法则是,如果要加入列,则需要在列上建立索引..
  • 忘掉INSERT,直到你得到你的SELECT。在一些数据库管理器(甚至 phpMyAdmin)中测试查询以获得正确的结果集(没有重复的行)。 select statemetnt 中使用的所有表都应该以某种方式关联,加入该关系并直接用于数据或在WHERE 子句或关系本身中的字段上过滤结果。 (可以在IN() 子句中使用子查询,但这会造成混乱)。 hollidays 表与查询无关。语法也是错误的——users 都应该加入到选定的表中,而这些表也不相关。 RTFM。
  • @shudder 你能不能展示一个像你这样的示例查询。
  • 显示数据结构

标签: php mysql inner-join


【解决方案1】:

我仍然不明白,但至少看到一些关系。下面的查询将返回所有员工的数据集和他们每个人的所有假期(h.date 列应该进入cur_date 表)。最后一个 JOIN 没有关系,因此它创建笛卡尔积 - 为每个已构建的行附加每个假期(总行数 = empl 的 nuber 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 是什么(假设是假期),但为什么在datetime 旁边使用date - 不应该是timedatedatetime?李>

【讨论】:

    【解决方案2】:

    这个终于成功了@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;
    

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 2013-06-01
      • 2023-03-17
      • 2013-09-25
      • 2015-05-26
      • 1970-01-01
      • 2017-08-24
      • 2012-07-19
      • 1970-01-01
      相关资源
      最近更新 更多