2016-06-11 71 views
1

需要插入到表public_holidays,按給定日期匹配假期表日期,它應匹配CLOCK表clock_in和clock_out時間字段並獲取28800 = 8小時的時間差(秒)並且還需要從用戶表user_id中匹配指定表,對於非常亂的代碼抱歉,非常困惑,任何幫助都可能非常有用,謝謝。Mysql插入查詢與多個地方和加入操作

鐘錶

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 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 
); 
+0

您的代碼結構和語義錯誤..你首先要從你需要的表開始,然後定義這些表之間的關係,然後定義條件..最後的選擇列 – scaisEdge

+0

MySQL討厭子查詢,即使你加入子查詢,也總是儘可能地嘗試連接。而黃金法則是,如果您加入某一列,則需要列上的索引。 – RJJ

+1

忘掉'INSERT',直到您獲得您的'SELECT'權限。在某些數據庫管理器(甚至是phpMyAdmin)中測試查詢以獲得正確的結果集(不重複行)。選擇statemetnt中使用的所有表都應以某種方式關聯起來,加入該關係並直接用於數據或用於在WHERE子句或關係本身中的字段上過濾結果。 (可以在'IN()'子句中使用子查詢,但它會造成混亂)。 「hollidays」表與查詢無關。語法也是錯誤的 - 兩個用戶都應該連接到選定的表格,這些語句也不相關。 RTFM。 – shudder

回答

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; 
1

我還是不明白,但至少看到了一些關係。下面的查詢將返回所有員工的數據集和每個人的所有假期(h.date列應進入cur_date表)。最後JOIN沒有關係因此產生笛卡爾乘積 - 重視每個節日每個已建成行(總行=的假期empl的x個nuber)

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 - 不應該是timedatedatetime只要?