如何编写MySQL查询

如何编写MySQL查询,mysql,join,distinct,Mysql,Join,Distinct,我在MySQL数据库中有这个表 -----------------tests--------------- ----athleteId----eventId----score---- ----129907-------1----------900------ ----129907-------2----------940------ ----129907-------3----------927------ ----129907-------4----------856------ ----32

我在MySQL数据库中有这个表

-----------------tests---------------
----athleteId----eventId----score----
----129907-------1----------900------
----129907-------2----------940------
----129907-------3----------927------
----129907-------4----------856------
----328992-------1----------780------
----328992-------2----------890------
----328992-------3----------936------
----328992-------4----------864------
----492561-------1----------899------
----492561-------2----------960------
----492561-------3----------840------
----492561-------4----------920------
----487422-------5----------900------
----487422-------6----------940------
----487422-------7----------927------
----629876-------5----------780------
----629876-------6----------890------
----629876-------7----------940------
----138688-------5----------899------
----138688-------6----------950------
----138688-------7----------840------
-------------------------------------
我想要这个输出

---------------output----------------
----eventId----athleteId----score----
----1----------129907-------900------
----2----------492561-------960------
----3----------328992-------936------
----4----------//////-------///------
----5----------487422-------900------
----6----------138688-------950------
----7----------629876-------940------
我们通过这个查询部分解决了这个问题,但是我希望每个eventId只有一个不同的athleteId。目前,如果两个项目的最佳表现由同一名运动员完成,该运动员将在输出中出现两次。如果发生这种情况,我需要表现第二好的运动员出现,而不是第一名

缩短:一名运动员不能在结果中出现两次

SELECT athleteId, a.eventId, a.score
FROM tests AS a
JOIN (
-- This select finds the top score for each event
SELECT eventId, MAX(score) AS score
FROM tests 
GROUP BY eventId
) AS b
-- Join on the top scores
ON a.eventId = b.eventId
AND a.score = b.score

下面是如何在调用方代码中实现这一点(本例中为PHP)

使用查询:

SELECT athleteId, eventId, score
FROM tests
ORDER BY score DESC;
$events = array(); // Remember events reported
$athletes = array(); // Remember athletes listed

while ($row = mysqli_fetch_assoc($results)) {
  if (isset($events[$row['eventId']]) || isset($athletes[$row['athleteId']])) {
     continue;
  }
  $events[$row['eventId']] = true;
  $athletes[$row['athleteId']] = true;
  print_row($row);
}
然后使用以下代码处理查询结果(我将跳过所有样板文件以执行查询):


下面是如何在调用方代码中实现这一点(本例中为PHP)

使用查询:

SELECT athleteId, eventId, score
FROM tests
ORDER BY score DESC;
$events = array(); // Remember events reported
$athletes = array(); // Remember athletes listed

while ($row = mysqli_fetch_assoc($results)) {
  if (isset($events[$row['eventId']]) || isset($athletes[$row['athleteId']])) {
     continue;
  }
  $events[$row['eventId']] = true;
  $athletes[$row['athleteId']] = true;
  print_row($row);
}
然后使用以下代码处理查询结果(我将跳过所有样板文件以执行查询):


看来你有问题了。在这里寻找一个解决方案:@AdrianCarneiro他正在寻找每组第二高的运动员,而不是最高的。如果同样的两名运动员在3个项目中分别获得第一名和第二名,那么第三个项目是否需要第三名?这可能在调用程序代码中比在SQL中更容易实现。确切地说……这太复杂了吗?看起来您有问题。在这里寻找一个解决方案:@AdrianCarneiro他正在寻找每组第二高的运动员,而不是最高的。如果同样的两名运动员在3个项目中排名第一和第二,那么第三个项目是否需要排名第三的运动员?这可能在调用程序代码中比在SQL中更容易实现。确切地说……这太复杂了吗?我正在检查。我马上就要报告了!很有效,谢谢。如果我需要男/女运动员怎么办?我是否应该添加$sex数组?对于每个事件中的顶级男性和女性:将
$events
制作为二维数组,第二维度为sex。然后检查
$events[$row['eventId][$row['sex']]
。我正在检查它。我马上就要报告了!很有效,谢谢。如果我需要男/女运动员怎么办?我是否应该添加$sex数组?对于每个事件中的顶级男性和女性:将
$events
制作为二维数组,第二维度为sex。然后检查
$events[$row['eventId][$row['sex']]]