2011-12-07 12 views
2

私は、複数のユーザーの勤務時間(小計) とユーザーID(volunteerID)を格納するテーブルデューティレコードを持っています。次の選択の文で、私は、各ユーザーIDの合計時間を設定しようとしています:ワンパスで更新して選択する

SELECT 
dutyrecord.VolunteerID, 
SEC_TO_TIME(SUM(TIME_TO_SEC(SubTotal))) AS total 
FROM 
volunteerinfo 
INNER JOIN 
dutyrecord ON 
(volunteerinfo.VolunteerID = dutyrecord.VolunteerID) 
GROUP BY 
dutyrecord.VolunteerID 

は、私は、各ユーザに合計時間を更新するために選択して更新ステートメントを組み合わせてもらえますか?私は幸運のような何かと他の方法を試しました:

UPDATE volunteerinfo 
SET 
TotalHours = 
( 
SELECT dutyrecord.VolunteerID , 
SEC_TO_TIME(SUM(TIME_TO_SEC(SubTotal))) AS total 
FROM 
volunteerinfo 
INNER JOIN 
dutyrecord ON (volunteerinfo.VolunteerID = dutyrecord.VolunteerID) 
GROUP BY 
dutyrecord.VolunteerID 
) 
WHERE 
volunteerinfo.VolunteerID = dutyrecord.VolunteerID` 

誰も私に手を差し伸べることはできますか?

UPDATE
申し訳ありませんが、いくつか試してみると私は答え、私の質問をするために、より明確な方法を考え出す他の例。 私の質問をクリアするには:このプロセスの言語を独立させたいので、このプロセスを1つにまとめることはできますか? (私はちょうど行うさまざまで1つのSQL文を運ぶ。)

  • まず、私は私一人一人のための労働時間

    SELECT VolunteerID、SEC_TO_TIME(SUM(TIME_TO_SEC(小計の合計を与えるために、テーブルを選択))))AS合計 デューティレコードから GROUP BY VolunteerID

    ID:10001、1時00分02秒ID:2001、午前10時00分34秒....

  • Iは、それらのID

    更新に応じて別のテーブルへの結果(合計)を更新する、後Volunteerinfo セットVolunteerinfo.totalhours = dutyrecord.total Volunteerinfo.VolunteerID = dutyrecord.VolunteerID

答えて

0

私の答えは、最初に両方のテーブルを結合すると、updateとselect文が1つの行で機能します。内部結合または他の方法がこのクエリのパフォーマンスを向上させる場合は、私にもコメントしてください。

update volunteerinfo I 
join 
    (SELECT VolunteerID, SEC_TO_TIME(SUM(TIME_TO_SEC(SubTotal))) AS total 
FROM dutyrecord 
GROUP BY VolunteerID) R on R.volunteerid = I.volunteerid 
set I.totalhours = R.total 
0

問題は、あなたが唯一のフィールドTotalHoursを更新しているが、あなたのサブクエリは、2つのフィールド(両方dutyRecord.VolunteerIDtotal)を選択していることです。サブクエリからdutyrecord.VolunteerIDを削除するだけで問題ありません。

EDIT:また、あなたはWHERE条件でそれを参照しているので、UPDATE文でdutyrecordを含める必要が新しいクエリは次のようになります。

UPDATE volunteerinfo, dutyrecord 
SET 
volunteerinfo.TotalHours = 
( 
SELECT 
SEC_TO_TIME(SUM(TIME_TO_SEC(SubTotal))) AS total 
FROM 
volunteerinfo 
INNER JOIN 
dutyrecord ON (volunteerinfo.VolunteerID = dutyrecord.VolunteerID) 
GROUP BY 
dutyrecord.VolunteerID 
) 
WHERE 
volunteerinfo.VolunteerID = dutyrecord.VolunteerID 
+0

ありがとうございました。エラー#1093 - 'volunteerinfo'をFROM句の更新に指定することはできません。また、入れ子にされた選択が1時間の合計時間を与えると考えています(同じボランティアID、例えばID:10001合計:15:10、ID:20002合計:1:01:02)。それぞれの場合の動的更新値です。可能であれば不思議 –

関連する問題