1

サブクエリに問題があります。

私は、地元のサイクリング クラブのためにベスト オブ 10 のタイム トライアル リーグを作成しています。参加者が自分の時間をテーブルに記録する毎週のリーグがあります。

これが私のストアドプロシージャです。

BEGIN
    #Routine body goes here...
        DROP TEMPORARY TABLE IF EXISTS tbl_Temp;

        CREATE TEMPORARY TABLE tbl_Temp (
        UserId int DEFAULT 0,
        TotalTime DECIMAL (10,2),
        EventCount int DEFAULT 0,
        FullName VARCHAR(255),
        Marshalled TINYINT(2) DEFAULT 0,
        HillClimb TINYINT(2) DEFAULT 0,
        Year INT(10)
        );

        INSERT INTO tbl_Temp (UserID,Year)
        SELECT DISTINCT userId,YEAR(date)
        FROM tbl_series;

        /* ---- EVENT COUNT */
        UPDATE tbl_Temp AS c,tbl_series AS t
        SET c.EventCount = (SELECT COUNT(userId) FROM tbl_series WHERE (UserID = t.userId))
        WHERE c.UserID = t.userId;

        /* ---- get the times into a temp table */


        /* ---- TOTAL TIME */
        UPDATE tbl_Temp AS c,tbl_series AS t
        SET c.TotalTime = (
            /*SELECT SUM(A.Time) FROM (
                    SELECT Time FROM tbl_series
                    WHERE (UserID = t.userId) 
                    LIMIT 10
                ) AS A*/
                SELECT SUM(Time) FROM tbl_series 
                WHERE (userId = t.UserId)
        )
        WHERE c.UserID = t.userId;

        /* ---- Name */
        UPDATE tbl_Temp AS c,tbl_users AS t
        SET c.FullName = (
                SELECT NAME
                FROM tbl_users
                WHERE (userId = t.UserId)
        ) 
        WHERE (c.userId = t.UserId);

        /* ---- Marshalled */
        /*  will need to add in a new table for marshalled so isn't lost over the coming years */
        UPDATE tbl_Temp AS c,tbl_users AS t
        SET c.Marshalled = (
                SELECT marshalled
                FROM tbl_users
                WHERE (userId = t.UserId)
        ) 
        WHERE (c.userId = t.UserId);

        /* ---- Hill Climb */
        UPDATE tbl_Temp AS c,tbl_users AS t
        SET c.HillClimb = (

            SELECT Count(tbl_series.SeriesID)
            FROM tbl_series
            INNER JOIN tbl_series_courses ON tbl_series.CourseID = tbl_series_courses.SeriesCourseID AND tbl_series.CourseID = tbl_series_courses.SeriesCourseID
            where (EventType = 2) AND (userId = t.UserId)

        ) 
        WHERE (c.userId = t.UserId);

        /* ---- select all */
        SELECT * FROM tbl_Temp

        ORDER BY EventCount Desc,TotalTime;

END

時間、userID、および courseID を格納する tbl_series

ユーザー、合計時間などを計算するストアド プロシージャを構築していますが、最速の上位 10 時間のみが必要ですが、MySql には制限があります。次のコードを実行できません。

/* ---- TOTAL TIME */
        UPDATE tbl_Temp AS c,tbl_series AS t
        SET c.TotalTime = (
            SELECT SUM(A.Time) FROM (
                    SELECT Time FROM tbl_series
                    WHERE (UserID = t.userId) 
                    LIMIT 10
                ) AS A
        )
        WHERE c.UserID = t.userId;

エラーが返ってきます

プロシージャの実行に失敗しました

1054 - 'where 句' の不明な列 't.userId'

どんなアイデアも素晴らしいでしょう、ありがとう。

4

1 に答える 1

0

ああ...単純です。MySqlはLIMIT内部クエリをサポートしていません。
カーソルを開き、メインの結果セットをループして、ループ内の各レコードに必要なデータをフェッチします。

于 2012-05-07T12:57:26.917 に答える