簡體   English   中英

查找具有特定條件的最大值並檢查同一組是否有更高/更低或任何值

[英]Find max value with specific criteria and check if there is higher/lower or any value for same group

我正在嘗試獲取游戲...用戶和信息的最大分數是否高於/低於用戶的最大值(其他玩家的分數)。 我會解釋情況。

用戶應該在每個游戲活躍的地方獲取他的游戲和最大分數。 這適用於JOINGROUP BY但我不知道如何獲取信息是否有更多分數以及它們是否高於或低於用戶最大分數。

表 1: scores

+----+--------+------+--------+-------+
| id | gameID | game | player | score |
+----+--------+------+--------+-------+
|  1 |      1 | pang | lea    |    50 |
|  2 |      1 | pang | lea    |    60 |
|  3 |      1 | pang | paola  |    70 |
|  4 |      2 | pong | lea    |   100 |
|  5 |      2 | pong | paola  |    90 |
+----+--------+------+--------+-------+

表 2: games

+----+------+--------+
| id | name | active |
+----+------+--------+
|  1 | pang | yes    |
|  2 | pong | yes    |
|  3 | pung | yes    |
+----+------+--------+

代碼:

$loggedUser = 'lea';
$sql = 
    "
SELECT s.gameID
     , s.game
     , COUNT(s.id) c
     , MAX(s.score) Max
  FROM scores s
 RIGHT 
  JOIN games g
    ON s.gameID = g.id
 WHERE g.active = 'yes' 
   AND s.player = '$loggedUser'
 GROUP 
    BY s.gameID 
 ORDER 
    BY c
";

輸出應如下所示:

你好 Lea,你的最高分:

pang 玩了 x 2,最高得分 60 分(最高得分為 70)...

pong 打了 x 1, 100 pts , 你有更高的分數....

在 MySQL 8.0 中,您可以使用窗口函數來:

  • 對每個游戲的玩家得分進行排名: ROW_NUMBER() OVER(PARTITION BY player, game ORDER BY score DESC)
  • 計算玩家每局游戲的次數: COUNT(*) OVER(PARTITION BY player, game)
  • 計算所有玩家中給定游戲的最高分: MAX(score) OVER(PARTITION BY game ORDER BY score DESC)

考慮以下查詢:

SELECT game_name, cnt games_played, score max_score, top_score
FROM (
    SELECT
        g.name game_name,
        s.player,
        s.score,
        ROW_NUMBER() OVER(PARTITION BY player, game ORDER BY score DESC) rn,
        COUNT(*) OVER(PARTITION BY player, game) cnt,
        MAX(score) OVER(PARTITION BY game ORDER BY score DESC) top_score
    FROM scores s
    INNER JOIN games g ON g.id = s.gameID AND g.active = 'yes'
) x WHERE rn = 1 AND player = 'lea';

這個 db fiddle與您的示例數據中,查詢產生:

| game_name | games_played | max_score | top_score |
| --------- | ------------ | --------- | --------- |
| pang      | 2            | 60        | 70        |
| pong      | 1            | 100       | 100       |

在早期版本的 MySQL 中,一種解決方案是使用聚合子查詢來計算所有玩家中每場比賽的最高分,並將其與主聚合查詢JOIN

SELECT g.name game_name, COUNT(*) games_played, MAX(s.score) max_score, ts.top_score
FROM  scores s
INNER JOIN games g 
    ON g.id = s.gameID AND g.active = 'yes'
INNER JOIN (SELECT gameID, MAX(score) top_score FROM scores GROUP BY gameID) ts 
    ON s.gameID = ts.gameID
WHERE s.player = 'lea'
GROUP BY s.player, g.id, g.name;

DB Fiddle 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM