2009-08-06 12 views
1

Q:どのようにしてMySQLにすべてのユーザーの評価を表示させ、次に評価を使って結果を並べ替えることもできますか?MySQLにすべてのユーザーの評価を表示させ、評価を使用して結果を並べ替えますか?

これはすべてゲーム用のはしごに使用されます。 weblGamesには報告されたすべてのゲームの結果があり、勝敗の情報、勝者/敗者の格付け(winner_elo & loser_elo)に関する情報が含まれています。ここで

は、テーブルの部分的スクリーンショットである:現在のMySQLのコードが表示されます(この場所への感謝を)すべての選手の名前と、彼は、最新のx日以内にプレイされるゲームの数だけ、このテーブルを使用してhttp://www.ubuntu-pics.de/bild/21059/screenshot_87_RTDZBb.png

、 。

私は(彼の最近プレイしたゲームでwinner_elo または loser_eloに等しい。)現在のEloポイントごとに選手をその情報を維持したいが、また出力できる

ここでそのコードがあります私は現在持っているとそれは、x日以内にすべてのプレーヤーと最新プレイされるゲームの彼/彼女の金額が表示されます。ここ

SELECT userid, count(*) as cnt 
FROM 
(
SELECT winner as userid 
from webl_games g 
where (g.reported_on > now() - interval 4 day 
UNION ALL 
SELECT loser as userid 
from webl_games g 
where g.reported_on > now() - interval 4 day 
) t 
GROUP BY userid 
HAVING COUNT(*) >= 3 

答えて

1
SELECT userid, COUNT(*) as cnt, 
     (
     SELECT CASE t.userid WHEN winner THEN winner_elo ELSE loser_elo END 
     FROM webl_games l 
     WHERE t.userid IN (winner, loser) 
     ORDER BY 
       reported_on DESC 
     LIMIT 1 
     ) AS last_elo 
FROM (
     SELECT winner as userid 
     FROM webl_games g 
     WHERE (g.reported_on > now() - interval 4 day 
     UNION ALL 
     SELECT loser as userid 
     FROM webl_games g 
     WHERE g.reported_on > now() - interval 4 day 
     ) t 
GROUP BY 
     userid 

サブクエリが非効率的にすることができます。それは、あなたのテーブルには、PRIMARY KEYを持っている場合

、このように書き換え:

SELECT userid, cnt, 
     (
     SELECT q2.userid WHEN winner THEN winner_elo ELSE loser_elo END 
     FROM webl_games l 
     WHERE l.id IN (lwin, llose) 
     ORDER BY 
       reported_on DESC 
     LIMIT 1 
     ) 
FROM (  
     SELECT userid, COUNT(*) as cnt, 
       (
       SELECT id 
       FROM webl_games l 
       WHERE t.userid = winner 
       ORDER BY 
         reported_on DESC 
       LIMIT 1 
       ) AS lwin, 
       (
       SELECT id 
       FROM webl_games l 
       WHERE t.userid = loser 
       ORDER BY 
         reported_on DESC 
       LIMIT 1 
       ) AS llose 
     FROM (
       SELECT winner as userid 
       FROM webl_games g 
       WHERE (g.reported_on > now() - interval 4 day 
       UNION ALL 
       SELECT loser as userid 
       FROM webl_games g 
       WHERE g.reported_on > now() - interval 4 day 
       ) t 
     GROUP BY 
       userid 
     ) q2 
+0

まず一つは、単に「user_elo」を「loser_elo」を修正し、最後に並べ替えを追加しました働きました。すぐに手伝って時間をとってくれてありがとう、本当に感謝します。 – eyerouge

+0

@eyerouge:2番目の方がより効率的です。 – Quassnoi

関連する問題