2017-10-03 11 views
1

私はMySQLの専門家ではありません。私は解決方法がわからない問題に直面しています。フィルタリングで別のテーブルのレコードを更新する

私は2つのテーブルを持っています。

Table `players` 
id | name | high_score 
---|------|----------- 
1 | john | - 
2 | mary | - 
3 | mike | - 

Table `scores` 
id | id_player | score 
---|-----------|------ 
1 | 1   | 12 
2 | 1   | 5 
3 | 3   | 8 
4 | 2   | 7 
5 | 2   | 25 
6 | 3   | 18 

これは愚かに聞こえることができ、私は第二のテーブルの最大値に基づいて、第1のテーブルの高得点記録を更新したいと思います。

は私が不完全で、この溶液に着い:

UPDATE `productos_players` p INNER JOIN `scores` s ON (p.id = s.id_player) SET p.high_score=s.score 

これは私がこれまで行ってきたものですが、私はまだ最大MAX()とリミットを取得するscoresのためのクエリを変更する必要がありますそれは1つの結果かそれに類するものですが、私はそれをどうやって行うのか、それが可能であってもわかりません。

ありがとうございます!

答えて

1

あなたはハイスコアを更新するには、次のUPDATEを試すことができます。

UPDATE `players` p 
SET p.high_score = (
    SELECT MAX(score) 
    FROM scores 
    WHERE id_player = p.id 
); 

デモ:http://sqlfiddle.com/#!9/7320c3/2/0


別の解決策は、VIEWを使用することです:

CREATE VIEW v_players AS 
    SELECT players.*, MAX(scores.score) AS 'high_score' 
    FROM players LEFT JOIN scores ON players.id = scores.id_player 
    GROUP BY players.id 

VIEWを使用する利点は、scoresテーブルを変更するたびにテーブルを更新しないことです。 UPDATEクエリが自動的に、INSERTUPDATEまたはscoresテーブルのDELETETRIGGERUPDATEにテーブルの上に使用することができます

TRIGGERを使用して自動的に UPDATEを使用する方法


DELIMITER // -- trigger on UPDATE of table scores. CREATE TRIGGER upd_players AFTER UPDATE ON scores FOR EACH ROW BEGIN UPDATE `players` p SET p.high_score = ( SELECT MAX(score) FROM scores WHERE id_player = p.id AND id_player = NEW.id_player ); END;// -- trigger on INSERT of table scores. CREATE TRIGGER ins_players AFTER INSERT ON scores FOR EACH ROW BEGIN UPDATE `players` p SET p.high_score = ( SELECT MAX(score) FROM scores WHERE id_player = p.id AND id_player = NEW.id_player ); END;// -- trigger on DELETE of table scores. CREATE TRIGGER del_players AFTER DELETE ON scores FOR EACH ROW BEGIN UPDATE `players` p SET p.high_score = ( SELECT MAX(score) FROM scores WHERE id_player = p.id AND id_player = OLD.id_player ); END;// DELIMITER ; 
+1

最初のクエリでグループが重複していませんか? –

+1

@ P.Salmon - そうです。除去された。 –

+0

どうもありがとう。どのようなシンプルで素敵な解決策! 私は間違ったやり方をしていましたが、問題は複雑すぎていました;-) – Carles

関連する問題