2

私は mySQL/PHP で書いていますが、この問題があり、理解できません。この 1 つの PHP スクリプトには、2 つの SQL ステートメントが含まれています。私がやろうとしているのは、スポーツ リーグ テーブル (tblrank と呼ばれる SQL テーブル - テーブル ID で区切られた多くのリーグ テーブルを含む) を更新し、最後に更新されてからチームが上昇したか下降したかを示すことです。この最初のコードは少しぎこちなく、おそらくもっとうまく書けたはずです (MSSQL では約 6 行で記述できます)。これは、それより下位にランク付けされたチームの数を数えてから 1 つ追加することによって機能します。後で説明するように、うまくいくようです... ある種。

update tblrank AS r
        set Rank = 1 + (select count(*) from 
                             (select r2.teamID
                              from tblrank r2
                                   inner join tblrank r3
                              where r3.TableID = r2.TableID and r3.TableID = $tableid
                              and (r3.Points > r2.Points
                                  or (r3.Points = r2.Points and r3.TieBreaker > r2.TieBreaker))) as duh
                        where duh.teamID = r.teamID 
                        and duh.TableID = r.TableID 
                        and r.TableID = $tableid

次に、このコードを実行して、表示する画像を選択します。

update tblrank
set image = case when Rank < LastRank then 'up.png'
        when Rank > LastRank then 'down.png'
        else 'nomove.png' end
where TableID = $tableid

これを $tableid = 1 で実行すると、問題なく動作します。しかし、$tableid = 2 で実行すると、tblRank 全体のすべてのランクが 1 に設定されます ($tableid = 2 で実行する前は、TableID =1 のレコードを除いてすべてのランクが 1 です)。これは明らかに私が望むものではありません。

どちらのステートメントも if(mysql_query($sql)) 条件内にあるため、実行されたかどうかを確認できます。

私は mySQL よりも MS SQL をよく使用するので、専門家ではありません。コードの両方のチャンクが実行されることを確認しました。2 つの間で他の SQL は実行されません。

4

2 に答える 2

0

これが私がそれを行う方法です。最初にすべてのRank値をゼロに初期化します。

UPDATE tblrank SET Rank = 0;

UPDATE tblrank r1 JOIN tblrank r2 ON r1.TableID = r2.TableID
SET r1.Rank = r1.Rank + 1
WHERE r1.Points > r2.Points 
  OR (r1.Points = r2.Points AND r1.TieBreaker > r2.TieBreaker)

結合は、各行を、テーブルとチームが同じで、スコアが低いr1行のセットに自然に一致させます。r2次にRank、これらの一致する行ごとに 1 ずつ増加します。

于 2010-01-14T02:00:40.617 に答える
0

まあ、私はそれを修正しました。何が間違っていたのかわかりませんが、更新ステートメントを分割し、rankcount という一時テーブルを作成して最初に入力しました。何が起こっているのかを簡単に確認するためにこれを行いました。

create temporary table rankcount (TableID int, UserID int)");
   insert into rankcount (TableID, UserID)
            select r2.TableID, r2.UserID
                from tblRank r2
                                inner join tblRank r3
            where r3.TableID = r2.TableID and r3.TableID = $tableid
            and (r3.Points > r2.Points
                   or (r3.Points = r2.Points and r3.TieBreakerOne > r2.TieBreakerOne))

次に、これは機能します...

update userEntryTableRank r
        set Rank = 1 + (select count(*) from rankcount rc
                        where rc.UserID = r.UserID and rc.TableID = r.TableID)
        where r.TableID = $tableid

:)

于 2010-01-13T22:37:43.377 に答える