2017-01-17 8 views
0

私はemployee_projects(employeeIDとprojectIDを参照する)という別のピボットテーブルに基づいて空のレコードを挿入したいテーブル 'タイムシート'を持っています。私は基本的にEmployeeIDを入力として使用して、従業員がemployees_projectsテーブルを介して割り当てたすべてのプロジェクトを表示するタイムシートテーブルにINSERT/UPDATEクエリを生成します。2列の特定の組み合わせが存在する場合にのみ値を選択しますか?

例:Fooという名前の従業員には、employeeIDが1に設定されています.barという名前のprojectが1のprojectIDです。employeesID = 1かつprojectID = 1のemployees_projectsにレコードが存在します。さて、Fooがタイムシートphpファイルをロードすると(セッション内に彼の$ employeeIDがすでに格納されている)、私はプロジェクト・バーのタイムシート・レコードを設定したいだけです。それだけでINNER JOINをされているので、私は使用していたクエリが古い、

$result = $conn->query("select timesheets.id, Monday, Tuesday, Wednesday, Thursday, Friday, WeekEndingDate, Notes, Submitted, EmployeeID, ProjectID, projects.ProjectName from timesheets INNER JOIN projects ON timesheets.ProjectID=projects.id WHERE EmployeeID=$eId"); 

while ($row = $result->fetch_assoc()) { 

       unset($id,$Mon,$Tues,$Wed,$Thurs,$Fri,$WeekEndingDate,$notes,$employeeId,$projectId,$projectName); 
       $id = $row['id']; 
       $Mon = $row['Monday']; 
       $Tues = $row['Tuesday']; 
       $Wed = $row['Wednesday']; 
       $Thurs = $row['Thursday']; 
       $Fri = $row['Friday']; 
       $WeekEndingDate= $row['WeekEndingDate']; 
       $notes = $row['Notes']; 
       $employeeId = $row['EmployeeID']; 
       $projectId = $row['ProjectID']; 
       $projectName = $row['ProjectName']; 

       echo '<tr><td>'. $projectId.'</td><td>'.$projectName.'</td><td><input type="text" id="Mon" value='.$Mon.'></td><td><input type="text" id="Mon" value='.$Tues.'></td><td><input type="text" id="Mon" value='.$Wed.'></td><td><input type="text" id="Mon" value='.$Thurs.'></td><td><input type="text" id="Mon" value='.$Fri.'></td><td>'.$notes.'</td></tr>'; 

あなたが見ることができるように:ここで私はタイムシートのテーブルを構築するために使用していますPHPのコードがある、あなたは、私が使用していた列を見ることができますemployees_projectsではなく、projectsテーブル。その従業員に割り当てられているプロジェクトのタイムシート内のすべての列を返すようにクエリを変更する方法はわかりません。

助けが必要ですか?

EDIT

申し訳ありませんが、私は明確にしようとします。私は$ resultのコードで上に示したSELECTクエリに基づいてフォームを構築するためにPHPを使用しています。これはフォームを正しく構築していますが、現在はプロジェクトテーブル内のすべてのプロジェクト(つまり、projectID1、projectID2など)を表示しています。私は、employees_projects内の列のemployeeID/projectIDの組み合わせに基づいて従業員に割り当てられたプロジェクトのみをreutrnするSELECTクエリが必要です。その後、私は私のPHPコードを使用して、サブミット時にINSERTクエリを作成します。

+1

タイムシートを再設計できますか?データベーステーブルがスプレッドシートではありません – Strawberry

+0

どのような種類のクエリを作成しようとしていますか?あなたは 'INSERT/UPDATE'クエリを生成したいが、プロジェクトを表示するはずだと言う。あなたは 'INSERT'と' UPDATE'で物事を表示しません。 – Barmar

+0

申し訳ありませんが、私は明確にしようとします。私は$ resultのコードで上に示したSELECTクエリに基づいてフォームを構築するためにPHPを使用しています。これはフォームを正しく構築していますが、現在はプロジェクトテーブル内のすべてのプロジェクト(つまり、projectID1、projectID2など)を表示しています。私は、employees_projects内の列のemployeeID/projectIDの組み合わせに基づいて従業員に割り当てられたプロジェクトのみをreutrnするSELECTクエリが必要です。その後、私は私のPHPコードを使用して、サブミット時にINSERTクエリを作成します。 – Pstivala7

答えて

1

は一緒にすべてのテーブルを結合:

SELECT ... 
FROM projects AS p 
JOIN employee_projects AS ep ON p.id = ep.projectID 
JOIN employees AS e ON e.id = ep.employeeID 
LEFT JOIN timesheets AS t ON t.projectID = p.id and t.employeeID = e.id 
WHERE p.name = 'Bar' 

私はあなたがまだそれらのいくつかは、タイムシートに記入していない場合でも、プロジェクトに割り当てられたすべての従業員の行を取得しますtimesheetsためLEFT JOINを使用しました。

employee_projectstimesheets両方がprojectIDemployeeID外部キーを持っているので、正規化することができ、ここで、いくつかの冗長性がありますように思えます。 employee_projectsテーブルにIDへの単一の外部キーがあった方が良いでしょう。

+0

うーん、これははるかに良いと思う。このクエリはうまくいくのでしょうか、それとも冗長になりますか? select ID、月曜日、火曜日、水曜日、木曜日、金曜日、WeekEndingDate、Notes、提出済み、employees_projects.EmployeeID、employees_projects.ProjectIDタイムシートINNER JOIN employees_projects on timesheets.EmployeeID = employees_projects.EmployeeID AND timesheets.ProjectID = employees_projects.ProjectID WHEREタイムシート。EmployeeID = $ eID – Pstivala7

+0

申し訳ありませんがコメントで書式を設定する方法がわかりません^^ – Pstivala7

+0

コメントの書式設定はできません。それを質問の更新版として追加します。 – Barmar

関連する問題