PostgreSQL Order by 不起作用,它不会根据顺序 returns 取值

PostgreSQL Order by not working, it doesn’t returns values according to the order

我有两个 tables 球员和分数。 在播放器上 table 我有两个字段,name 和 id (PK) 在分数上我有几个字段 [id_score(PK),获胜者和失败者是玩家 ID 的外键] id 锦标赛和 id 比赛。

Players
 id_players |   name    
------------+-----------
         41 | Antonia
         42 | Roberto
         43 | Luis
         44 | Pedro
         45 | Fernando
         46 | Alejandra
         47 | Rene
         48 | Julieta

Scores
id_score | id_matches | winner | looser | id_tournament | round 
----------+------------+--------+--------+---------------+-------
       19 |         22 |     41 |     42 |            21 |     1
       20 |         23 |     43 |     44 |            21 |     1
       21 |         24 |     45 |     46 |            21 |     1
       22 |         25 |     47 |     48 |            21 |     1
       23 |         26 |     43 |     41 |            21 |     2
       24 |         27 |     45 |     47 |            21 |     2
       25 |         28 |     42 |     44 |            21 |     2
       26 |         29 |     48 |     46 |            21 |     2
       27 |         30 |     43 |     45 |            21 |     3
       28 |         31 |     42 |     48 |            21 |     3
       29 |         32 |     41 |     47 |            21 |     3
       30 |         33 |     46 |     44 |            21 |     3

我正在尝试获取包含以下内容的查询:
玩家ID
玩家姓名
获胜次数
游戏总数

目前我有这些查询。有点管用。当我按以下方式下订单时,它没有按照正确的订单退货

select p.id_players,p.name,count (s.winner) as wins, max(s.round)
from players p 
left join scores s on s.winner = p.id_players 
group by id_players, s.winner
order by s.winner desc;

 id_players |   name    | wins | max 
------------+-----------+------+-----
         41 | Antonia   |    2 |   3
         42 | Roberto   |    2 |   3
         43 | Luis      |    3 |   3
         45 | Fernando  |    2 |   2
         46 | Alejandra |    1 |   3
         47 | Rene      |    1 |   1
         48 | Julieta   |    1 |   2
         44 | Pedro     |    0 |    

有时,使用子查询更容易:

select p.*,
       (select count(*)
        from scores s
        where p.id_players in (s.winner, s.loser)
       ) as GamesPlayed,
       (select count(*)
        from scores s
        where p.id_players in (s.winner)
       ) as GamesWon
from players p
order by GamesWon desc;

如果回合的最大值是玩的游戏数,那么类似的逻辑就可以得到。

排序正常。问题是你要求它按 s.winner 排序,它指的是获胜玩家的 ID。如果你想根据大多数胜利来排序它们,你需要使用 ORDER BY wins DESC,也许还有一个用于平局的次要顺序子句。然后行将从获胜次数最多的玩家开始。

更合乎逻辑的查询是

SELECT s.winner, p.name, count(s.winner) as wins, max(s.round)
  FROM players p
    LEFT JOIN scores s ON s.winner = p.id_players 
  GROUP BY s.winner
  ORDER BY wins DESC;

这样你就不需要两个 GROUP BY,因为 s.winnerp.id_players 一样。