2

私は2つのテーブルを持っています:

  CREATE TABLE `fl_poll` (
  `id_poll` int(11) NOT NULL AUTO_INCREMENT,
  `id_player` int(11) NOT NULL,
  `position` varchar(50) NOT NULL,
  `score` int(11) NOT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ip` varchar(100) NOT NULL,
  PRIMARY KEY (`id_anketa`)
) ENGINE=MyISAM;

CREATE TABLE `fl_player` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_team` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `lastname` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

テーブル fl_player からすべてのプレーヤーを選択し、スコアを数えて、スコアが最も高い上位 3 人のプレーヤーで並べ替え、他のプレーヤーを姓で並べ替える方法はありますか? たとえば、6 人のプレーヤーがいます。

テーブル fl_player:

id     |     lastname    
------------------------
1             Smith           
2            Johnson          
3             Todd             
4             Dragon            
5             Bond             
6             Black       

テーブル fl_poll:

+-----------+-------+
| id_player | score |
+-----------+-------+
|         1 |     2 |
|         2 |     4 |
|         3 |     6 |
|         4 |     8 |
|         5 |    10 |
|         6 |    12 |
+-----------+-------+

そして、私は次のような結果を望みます:

+-----------+----------------------------------------+
| id_player |                lastname                |
+-----------+----------------------------------------+
|         6 | Black <-- top 3 with highest score     |
|         5 | Bond                                   |
|         4 | Dragon                                 |
|         2 | Johnson <-- from now order by lastname |
|         1 | Smith                                  |
|         3 | Todd                                   |
+-----------+----------------------------------------+
4

5 に答える 5

0

これでうまくいくはずです。サブセレクトに参加して上位 3 人を取得し、スコアの降順で並べ替えます。トップ 3 に入っていないプレーヤーにはスコアがないため、トップ 3 サブセレクトからのスコアは NULL になり (トップ 3 のいずれとも一致しなかったため)、トップ 3 の後に表示されます。単純にソートされます。 last_name 順。

SELECT po.id_player, lastname

FROM   fl_player pl

     LEFT JOIN 

(

SELECT pl.id, SUM(score) score

FROM   fl_player pl

       JOIN fl_poll po ON pl.id = po.id_player

GROUP BY pl.id

ORDER BY SUM(score) DESC

LIMIT 3

) as top3 on fl.id = top3.id

ORDER BY top3.score DESC, last_name

各プレイヤーのスコアを含める場合は、これを使用します。

SELECT po.id_player, lastname, SUM(score) score

FROM   fl_player pl

       JOIN fl_poll po ON pl.id = po.id_player

     LEFT JOIN 

(

SELECT pl.id, SUM(score) score

FROM   fl_player pl

       JOIN fl_poll po ON pl.id = po.id_player

GROUP BY pl.id

ORDER BY SUM(score) DESC

LIMIT 3

) as top3 on fl.id = top3.id

GROUP BY pl.id

ORDER BY top3.score DESC, last_name
于 2013-07-18T12:52:03.273 に答える