0

結果が1つの数値のみであることを考えるとうまく機能するクエリがありますが、複数の行が返されるようにする必要があり、ユーザー定義変数を使用しているため、クエリはそれを処理できません...これが元の手順です

CREATE DEFINER=`root`@`%` PROCEDURE `MapRank`(pTankID bigint,pMapID int, pColor int(2))
BEGIN
SET @RankNumber:=0; 
select RankNumber 
from 
(select 
    TankID,
    @RankNumber:=@RankNumber+1 as RankNumber,
    MapID,
    Color 
 from MAPDATA WHERE MapID = pMapID order by Rank DESC, TotalPP DESC) Query1 where TankID = pTankID AND COLOR = pColor ;
END

これは単一の数値を返し、基本的にレコードの数を数えて、「行」の場所を示します。

すべての mapid/color コンボのすべてのランクを表示できるように、mapid と color の場所を指定せずにすべての行を提供するように変更する必要があります。

これは私が持っているもので、現在は機能しません

SET @RankNumber:=0;
select 
    RankNumber,MapID,COlor
from
    (select 
        TankID,
            @RankNumber:=@RankNumber + 1 as RankNumber,
            MapID,
            Color
    from
        MAPDATA

    order by TotalPP DESC) Query1
where
    TankID = 18209 ORDER BY RankNumber

得られるクエリ結果は次のようになります。

1062    3   1
3544    3   0
6717    17  1
6752    17  3
7453    3   2
7860    17  0
7984    17  2
9220    3   3

手動で実行すると、最初のクエリでランク番号が9220であることを示すマップID 3と色3が表示されます

6022

おそらく複数のMySQL接続からこれを実行できるようにする必要があるため、一時変数を使用せずに実行するのが理想的です。

4

1 に答える 1

0

さらに掘り下げて混乱させた後、外部選択内から変数をゼロに戻すことが解決策であることがわかりました。ユーザー定義の変数は接続レベルであり、プーリングを利用しているため、問題は発生しません。

SET @RankNumber:=0;
select 
    RankNumber,MapID,COlor, @RankNumber:=0
from
    (select 
        TankID,
            @RankNumber:=@RankNumber + 1 as RankNumber,
            MapID,
            Color
    from
        MAPDATA

    order by MapID, Rank DESC, TotalPP DESC ) Query1
where
    TankID = pTankID ORDER BY RankNumber;
于 2012-12-31T01:37:03.190 に答える