Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当我使用MAX(ColA)和GROUP BY ColB时,如何从表中选择行_Mysql_Greatest N Per Group - Fatal编程技术网

Mysql 当我使用MAX(ColA)和GROUP BY ColB时,如何从表中选择行

Mysql 当我使用MAX(ColA)和GROUP BY ColB时,如何从表中选择行,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我发现这是非常相似的,但我仍然有一些麻烦 所以我从名为Scores的表开始 id | player | time | scoreA | scoreB | ~~~|~~~~~~~~|~~~~~~|~~~~~~~~|~~~~~~~~| 1 | John | 10 | 70 | 80 | 2 | Bob | 22 | 75 | 85 | 3 | John | 52 | 55 | 75 | 4 | Ted | 39

我发现这是非常相似的,但我仍然有一些麻烦

所以我从名为Scores的表开始

id | player | time | scoreA | scoreB |
~~~|~~~~~~~~|~~~~~~|~~~~~~~~|~~~~~~~~|
 1 | John   |  10  |   70   |   80   |
 2 | Bob    |  22  |   75   |   85   |
 3 | John   |  52  |   55   |   75   |
 4 | Ted    |  39  |   60   |   90   |
 5 | John   |  35  |   90   |   90   |
 6 | Bob    |  27  |   65   |   85   |
 7 | John   |  33  |   60   |   80   |
我想为每个球员选择最好的平均分数,以及记录中的信息。为了澄清,最佳平均分数将是scoreA+scoreB/2的最高值

结果是这样的

id | player | time | scoreA | scoreB | avg_score |
~~~|~~~~~~~~|~~~~~~|~~~~~~~~|~~~~~~~~|~~~~~~~~~~~|
 5 | John   |  35  |   90   |   90   |    90     |
 2 | Bob    |  22  |   75   |   85   |    80     |
 4 | Ted    |  39  |   60   |   90   |    75     |
基于我上面链接的问题,我尝试了这样的查询

SELECT
   s.*,
   avg_score
FROM
   Scores AS s 
INNER JOIN (
   SELECT
      MAX((scoreA + scoreB)/2) AS avg_score,
      player,
      id
   FROM
      Scores
   GROUP BY
      player
) AS avg_s ON s.id = avg_s.id
ORDER BY
   avg_score DESC,
   s.time ASC
这实际上给我的是

id | player | time | scoreA | scoreB | avg_score |
~~~|~~~~~~~~|~~~~~~|~~~~~~~~|~~~~~~~~|~~~~~~~~~~~|
 1 | John   |  10  |   70   |   80   |    90     |
 2 | Bob    |  22  |   75   |   85   |    80     |
 4 | Ted    |  39  |   60   |   90   |    75     |
如您所见,它从记录5中获得了正确的max avg_分数,但从另一个记录记录1中获得了其余信息。我错过了什么?如何确保所有数据都来自同一记录?我得到了正确的平均分数,但我需要与该记录相关的其余数据,在本例中为记录5

提前谢谢

试试看

SELECT s.*,
       q.avg_score
  FROM scores s JOIN
(
  SELECT player, 
         MAX((scoreA + scoreB)/2) AS avg_score
    FROM scores
   GROUP BY player
) q ON s.player = q.player 
   AND (s.scoreA + s.scoreB)/2 = q.avg_score
 ORDER BY q.avg_score DESC, s.time ASC
样本输出:

| ID | PLAYER | TIME | SCOREA | SCOREB | AVG_SCORE | ---------------------------------------------------- | 5 | John | 35 | 90 | 90 | 90 | | 2 | Bob | 22 | 75 | 85 | 80 | | 4 | Ted | 39 | 60 | 90 | 75 | 这里是演示

试试看

SELECT s.*,
       q.avg_score
  FROM scores s JOIN
(
  SELECT player, 
         MAX((scoreA + scoreB)/2) AS avg_score
    FROM scores
   GROUP BY player
) q ON s.player = q.player 
   AND (s.scoreA + s.scoreB)/2 = q.avg_score
 ORDER BY q.avg_score DESC, s.time ASC
样本输出:

| ID | PLAYER | TIME | SCOREA | SCOREB | AVG_SCORE | ---------------------------------------------------- | 5 | John | 35 | 90 | 90 | 90 | | 2 | Bob | 22 | 75 | 85 | 80 | | 4 | Ted | 39 | 60 | 90 | 75 |
这里是演示

@Kashi查看更新的答案,但草莓是第一个。您不能按id分组并获得按玩家分组的所需结果。@Kashi看到更新的答案,但草莓是第一个。你不能按id分组,也不能按玩家分组得到想要的结果。这确实给了我想要的结果,谢谢!但我也在想,为什么用y.id=x.id而不是y.max\u avg\u score=x.scoreA+x.scoreB/2加入是行不通的?也许我对MAX的工作方式还不太熟悉。幸运的是,已经有很多书都是关于这个主题的,所以我就不谈了。近7年后,再回到这个问题上,7年后,我更明智了,我很欣赏这个解决方案,但缺乏解释和对我的评论的不屑一顾的回应令人失望。这确实给了我想要的结果,谢谢你!但我也在想,为什么用y.id=x.id而不是y.max\u avg\u score=x.scoreA+x.scoreB/2加入是行不通的?也许我对MAX的工作方式还不够熟悉。幸运的是,关于这个话题已经有很多书了,所以我就不谈了。近7年后,再回到这个问题上,7年后,我更明智了,我很欣赏这个解决方案,但缺乏解释和对我评论的轻蔑回应令人失望。