0

これが問題です。私はしばらくの間これらのスレッドを調べてきましたが、正確な解決策をまだ見つけていません。

私は、これが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
4

1 に答える 1

0

これはどう?手続きに入れてください。

delimiter //

CREATE PROCEDURE get_top3_rating_avg() AS BEGIN
    SET @rank = NULL;
    SET @prevrunnerid = NULL;
    SELECT r.id, r.FirstName,r.MiddleName,
           r.LastName,r.Age,r.Gender,r.City,r.State, 
           ROUND(top3rating.Rating, 2) as Rating 
    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 //

delimiter ;
于 2012-07-27T03:04:09.533 に答える