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.winner
和 p.id_players
一样。
我有两个 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.winner
和 p.id_players
一样。