これが問題です。私はしばらくの間これらのスレッドを調べてきましたが、正確な解決策をまだ見つけていません。
私は、これが2つのテーブルを結合することに関係しているほとんどの質問のように、2つのテーブルを持っています。1つは基本的に、20,000レコードを少し超えるランナーのリストを含むテーブルであり、2つ目のテーブルは、35000レコードを少し超えるランナーの結果のリストです。2番目のテーブルは、実際には、すべての結果情報に加えて、ビューによって生成された年齢層と評価を含むビューです。私が今必要としているのは、各ランナーごとに上位3つの評価を組み合わせることです。私はこれを最初に試しました。
SELECT
r.id,
r.FirstName,
r.MiddleName,
r.LastName,
r.Age,
r.Gender,
r.City,
r.State,
ROUND((SELECT SUM(re.Rating) rating FROM vwResults re WHERE re.runnerid = r.id ORDER BY re.Rating DESC LIMIT 3)/3,2) Rating
FROM Runners r
残念ながら失敗しました。私がやろうとしているのは、結果テーブルの上位3つの評価を合計し、それを3に分けて平均を取得することです。これは、そのユーザーの平均評価になります。上記のコードのいくつかの異なるバリエーションを試しましたが、部分的に機能するようになりましたが、30レコードをロードするのに8秒かかり、データが正しくありませんでした。評価が組み込まれた新しいランナービューを作成できるように、これを行う方法はありますか?可能な限り手順を使用したくない。
Runners Table Structure
id int(11)
FirstName varchar(50)
MiddleName varchar(50)
LastName varchar(50)
Age int(3)
Gender varchar(2)
City varchar(50)
State varchar(2)
userid int(11)
vwResults View Structure
DistanceID int(4)
distance varchar(100)
RaceID int(11)
name varchar(100)
FirstName varchar(50)
LastName varchar(50)
place int(100)
Gender varchar(2)
age int(11)
finistime varchar(100)
pace time
agegrade varbinary(19)
ResultID int(11)
RunnerID int(11)
typeid int(11)
ftimesec bigint(10)
Rating decimal(18,2)
vwResultsから必要なのは、合計された上位3つの評価と、新しい平均評価とランナーテーブルのすべての情報を取得するための/3つだけです。
評価を取得する関数を作成しようとしていますが、mysql関数については何も知りません。誰かが、ここで間違っていることを教えてくれます。
CREATE FUNCTION GetRating(
Runnerid int( 11)
)
RETURNS decimal( 18, 2)
READS SQL DATA
BEGIN
DECLARE Rat decimal(18,2);
SELECT ROUND(SUM(Rating)/3,2) INTO Rat FROM vwResults WHERE runnerid = Runnerid GROUP BY runnerid
ORDER BY Rating DESC LIMIT 3;
RETURN(Rat);
END
以下のコードを機能させようとしていますが、以下のエラーが発生し続けることに問題があるようです。
1064-SQL構文にエラーがあります。3行目の''の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。
CREATE PROCEDURE usb_GetRatings()
BEGIN
SET @rank = NULL;
SET @prevrunnerid = NULL;
DROP TABLE IF EXISTS ttRunners;
SELECT r.id, r.FirstName,r.MiddleName,
r.LastName,r.Age,r.Gender,r.City,r.State,
ROUND(top3rating.Rating, 2) as Rating INTO ttRunners
FROM Runners as r
JOIN (SELECT runnerid, AVG(Rating) as Rating
FROM (SELECT if(@prevrunnerid = runnerid,
@rank := @rank + 1,
@rank := 1) as rank,
@prevrunnerid := runnerid
as runnerid,
Rating
FROM vwResults
ORDER BY runnerid, Rating) as sq
WHERE rank <= 3
GROUP BY runnerid) as top3rating
on (r.id = top3rating.runnerid);
END