1

現在、何らかの形式のループ内で次のことを行う方法を見つけようとしています (できれば、データベースのパフォーマンスに影響を与えずに)。

私は 3 つのテーブルを持ってuser_hoursuser_calendarますhours_statistics。私は最初に行う必要があります:

SELECT user_calendar.date_start,
       user_calendar.opportunity_id,
       user_hours.user_id,
       user_hours.agreed_hours,
       user_hours.completed_hours,
       user_hours.hours_committed
FROM   user_calendar
       JOIN user_hours
         ON user_calendar.user_calendar_id = user_hours.user_calendar_id
WHERE  user_calendar.date_start = CURRENT_DATE()
       AND user_hours.completed_hours IS NULL
       AND user_hours.hours_committed = 'accepted'

このクエリは、次のように返されます。

http://i.imgur.com/5cJ5v.png

したがって、返された各機会 ID とユーザー ID について、次のようにします。

UPDATE user_hours
SET    completed_hours = agreed_hours,
       hours_committed = 'completed'
WHERE  opportunity_id = {opportunity_id}
       AND user_id = {user_id}
       AND hours_committed = 'accepted'
       AND completed_hours IS NULL

この時点で {opportunity_id} と {user_id} をループする必要があることに注意してください (スクリーンショットを参照)。機会ごとに各ユーザーを調べる必要があるためです。

次に、更新されたレコードごとに、次のような合計時間を取得する必要があります。

// Get hours they have done to send to statistics data table
SELECT sum(completed_hours) FROM user_hours WHERE user_id = {user_id} AND opportunity_id = {opportunity_id} 

// Get the completed hours total somehow as a variable
$completed_hours = (from result above)

// Commit stats
UPDATE hours_statistics SET completed_hours = (completed_hours+$completed_hours)
WHERE user_id = {user_id} AND opportunity_id =  {opportunity_id} 

誰かがこれをある種の手順またはトリガーとして書くのを手伝ってくれますか、またはこのことをループするための出発点を得るために正しい方向に私を助けてくれますか? クエリは手動で機能します。統計の更新を実行するには、ループ/自動で行う必要があります。

4

1 に答える 1

2

hours_statisticsが更新されるたびに更新するトリガーを作成できます(アプリケーション ロジックによっては、および操作にuser_hours同様のトリガーを追加することもできます)。INSERTDELETE

UNIQUEキーが定義されていると仮定すると、トリガー内でhours_statistics.(user_id, opportunity_id)使用できます。INSERT ... ON DUPLICATE KEY UPDATE

CREATE TRIGGER foo AFTER UPDATE ON user_hours FOR EACH ROW
  INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
    (OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
    (NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
  ON DUPLICATE KEY UPDATE
    completed_hours = completed_hours + VALUES(completed_hours);

次に、単一のUPDATEステートメントを使用して (複数テーブル構文を使用して と結合user_hours) user_calendar、すべての更新をuser_hours一度に実行できます。これにより、上記のトリガーが必要に応じて更新hours_statisticsされます。

UPDATE user_hours JOIN user_calendar USING (user_calendar_id, opportunity_id)
SET    user_hours.completed_hours = agreed_hours,
       user_hours.hours_committed = 'completed'
WHERE  user_hours.hours_committed = 'accepted' 
   AND user_hours.completed_hours IS NULL
   AND user_calendar.date_start = CURRENT_DATE();
于 2012-08-26T11:01:30.150 に答える