2016-06-11 7 views
1

public_holidaysテーブルにpublic_holidaysを休日テーブルの日付と一致するように挿入する必要があり、clockテーブルのclock_inおよびclock_out時間フィールドと一致し、28800 = 8hrsの時間差を秒単位で取得する必要があります。また、ユーザーテーブルuser_idから指定テーブルを照合する必要があります。非常に混乱したコードでご迷惑をおかけします。ご協力いただきありがとうございました。Mysql複数のwhereおよびjoin操作でクエリを挿入する

時計表

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

@shudder動作します。..あなたは必要なテーブルから最初に始めて、これらのテーブルの関係を定義してから、条件を最後に選択する列を選択します。 – scaisEdge

+0

MySQLはサブクエリを嫌います。そして、あなたが列に参加している場合は、列にインデックスが必要です。 – RJJ

+1

あなたが 'SELECT'の権利を得るまで、' INSERT'を忘れてしまいます。いくつかのdbマネージャ(phpMyAdminさえ)のクエリをテストして、正しい結果セットを得る(繰り返し行なし)。 select statemetntで使用されるすべてのテーブルは何らかの形で関係していなければなりません。その関係でJOINされ、WHERE句または関係自体のフィールドの結果をフィルタリングするために直接使用されます。 ( 'IN()'句の中でサブクエリを使うことは可能ですが、混乱を招くことになります)。 'hollidays'テーブルはクエリとは関係ありません。構文も間違っています - 両方の 'users'は選択されたテーブルに結合されなければならず、それらも関連しません。 RTFM。 – shudder

答えて

0

最後に、この1はあなたのコードは、構造的および意味的に間違っているの助けに感謝

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テーブルが何であるかを知ってはいけません - 標準の勤務時間(従業員一人あたり1行 - これは真と思った)、毎日のタイムシート(従業員一人あたりの行)その標準的な勤務時間はなぜdatetimeで、timeではないのですか?毎日のタイムシートであれば、そのテーブルのどの8時間を選択する必要がありますか(そしてなぜ8時間ですか)
  • なぜこれらの8時間を計算/検索したのかわかりません - あなたはemplの休日を挿入しますか?その仕事
  • (任意の日に「時計」/による)のみ8時間は(休日を仮定)されているものcur_date知っているが、なぜdatetimedateを使用しないでください - timeまたはdateまたはdatetimeのいずれかであってはなりませんのみ?
関連する問題