0

トリビア ゲームがあり、次の 2 つのイベントに対してユーザーに報酬を与えたいと考えています:
1) 正しく答える
2) 質問プールに質問を送信する

特定のプレーヤーのスコアとランクを照会したいのですが、次のクエリを使用します。

SELECT (correct*10+sent*30) AS score, @rank:=@rank+1 AS rank 
FROM   (  trivia_players 
          JOIN (  SELECT COUNT(*) AS sent, senderid 
                  FROM trivia_questions 
                  WHERE senderid='$userid'
               ) a 
          ON trivia_players.userid=a.senderid
       )  
       ORDER BY score DESC

プレーヤーが両方のテーブルにいる場合、つまり正しく答えて質問を送信した場合に機能します。ただし、プレイヤーが質問を送信していない場合は機能しません

このクエリを修正する方法はありますか? ($userid は指定されたパラメーターです)

ありがとう!

ありがとうトム!唯一の問題はランクが正しくないことです:
userid スコアランク
58217 380 1
12354 80 3
32324 0 2

4

2 に答える 2

1

私はおそらく次のようにします:

SELECT
    user_id,
    score,
    rank
FROM
(
    SELECT
        TP.user_id,
        (TP.correct * 10) + (COUNT(TQ.sender_id) * 30) AS score,
        @rank:=@rank + 1 AS rank
    FROM
        Trivia_Players TP
    LEFT OUTER JOIN Trivia_Questions TQ ON
        TQ.sender_id = TP.user_id
    GROUP BY
        TP.user_id,
        TP.correct
    ORDER BY
        score DESC
) AS SQ
WHERE
    SQ.user_id = $user_id

私は MySQL をあまり使用しないので、構文が完全ではない可能性があります。MySQLではこのようなサブクエリが使えると思います。MySQL が に対して null 以外の値を持つ行のみをカウントすることによって COUNT() を処理すると仮定すると、これは機能するはずです。

重要なのは、Trivia Questions の null 以外の列に対して COUNT を実行して、ユーザーがそれらをカウントできるようにすることです。サブクエリを使用して、特定のユーザー ID に制約する前に全員のランクを取得できるようにする必要があります。

于 2010-09-07T16:43:37.690 に答える
0

RIGHT JOINまたはLEFT JOINを使用してみましたか? 頭のてっぺんから!

于 2010-09-07T16:35:28.897 に答える