2017-03-07 5 views
1

マークシートと呼ばれる生徒のスコア表があります。同じMySQLテーブルのサブクエリから一時フィールドを更新するにはどうすればいいですか?(MySqlエラー#1093を避けて)

id | student | score | position 
1 | Adora | 50  | 
2 | Sam  | 76  | 
3 | Frank | 40  | 


SELECT id, 1+(SELECT count(*) from marksheet a WHERE a.score > 
b.score) as student_rank 
FROM marksheet b 


id | student | score | student_rank 
1 | Adora | 50  | 2 
2 | Sam  | 76  | 1 
3 | Frank | 40  | 3 

問題は、ランキングクエリと更新クエリを同時に実行することです。私はランクを位置としてテーブルに保存します。 だから私は実行します。

UPDATE marksheet AS marks SET marks.position = 
(SELECT id, 1+(SELECT count(*) from marksheet a WHERE a.score > 
b.score) as student_rank 
FROM marksheet b) ; 

MySQLは言った:

#1093 - Table 'marksheet' is specified twice, both as a target for 
'UPDATE' and as a separate source for data 

私は自分自身のサブクエリでテーブルを更新する似たようなケースのためのstackoverflowを通じて閲覧しています。私は1つまたは2つのことを学んだ多くの例に出くわしましたが、成功していない例を適用しようとしました。どんな提案も深く感謝しています。

あなたはmarksheetテーブルのエイリアスを使用して、元のテーブルでそれを登録しよう、次のようにする必要があると思います

答えて

1

UPDATE marksheet AS marks 
JOIN ( 
    SELECT id, 1+(SELECT count(*) from marksheet a WHERE a.score > 
    b.score) as student_rank 
    FROM marksheet b 
) t 
SET marks.position = t.student_rank 
WHERE marks.id = t.id 
+0

高く評価されています。私はそれを理解できなかった。私はJOINについてもっと読む必要があると思います。どうもありがとうございました。それは魔法のように機能します。私はすでにPHPの効率を損なうことを考えていました。私はとてもうれしい。これは最高です。 – Nditah

+0

@SamRansあなたは大歓迎です、私はあなたのために働いてうれしいです。 UPDATEは、SELECTを実行している同じテーブルでは使用できません。だからエイリアスを作ってから参加しなければならないのです。 –

関連する問題