0

我有一个包含 11 列的表,我想创建一个查询,删除全名列中具有重复名称的行,但保留结果列中具有最低值的行。目前我有这个。

SELECT
    MIN(sql363686.Results2014.Result),
    sql363686.Results2014.Temp,
    sql363686.Results2014.Full Name,
    sql363686.Results2014.Province,
    sql363686.Results2014.BirthDate,
    sql363686.Results2014.Position,
    sql363686.Results2014.Location,
    sql363686.Results2014.Date   
FROM
    sql363686.Results2014
WHERE
    sql363686.Results2014.Event = '50m Freestyle'
AND sql363686.Results2014.Gender = 'M'
AND sql363686.Results2014.Agegroup = 'Junior'
GROUP BY
    sql363686.Results2014.Full Name
ORDER BY
    sql363686.Results2014.Result ASC ;

乍一看,它似乎工作正常,我得到了所有正确的值,但我似乎在 Position 列中得到了一个不同的(错误的)值,而不是我在数据库表中的值。所有其他值似乎都是正确的。关于我做错了什么的任何想法?

我目前正在使用连接到 mysql 数据库的 dbVisualizer。此外,我对 sql 的知识和经验是最低限度的

4

2 回答 2

1

使用group by和一个join

select r.*
from sql363686.Results2014 r
     (select fullname, min(result) as minresult
      from sql363686.Results2014 r
      group by fullname
     ) rr
     on rr.fullname = r.fullname and rr.minresult = r.minresult;
于 2015-01-15T22:41:25.520 回答
0

您陷入了对 GROUP BY 的非标准 MySQL 扩展的陷阱。

(我不会使用所有这些完全限定的列名;这是不必要且冗长的。)

我认为您正在寻找每个游泳者在特定事件中的最佳时间,并且您正试图从所谓的非规范化表中提取它。看起来您的表有这些列。

Result
Temp
FullName
Province
BirthDate
Position
Location
Date   
Event
Gender
Agegroup

因此,第一步是为每个游泳者找到每个项目的最佳时间。为此,我们需要做出几个假设。

  1. 一个人由 FullName、BirthDate 和 Gender 唯一标识。
  2. 事件由事件、性别、年龄组唯一标识。

这个子查询将获得每个项目中每个游泳者的最佳时间。

SELECT MIN(Result) BestResult,
       FullName,BirthDate, Gender,
       Event, Agegroup
  FROM Results2014
 GROUP BY FullName,BirthDate, Gender, Event, Agegroup

这将为您提供一个虚拟表,其中包含每个人在每个事件中的最快结果(使用前面提到的人员事件的定义)。

现在的挑战是去找出每个人最佳时间的情况。这些情况包括 Temp、Provincial、Position、Location、Date。我们将通过原始表和我们的虚拟表之间的 JOIN 来做到这一点,就像这样

SELECT resu.Event,
       resu.Gender,
       resu.Agegroup,
       resu.Result,
       resu.Temp.
       resu.FullName,
       resu.Province,
       resu.BirthDate,
       resu.Position,
       resu.Location,
       resu.Date
  FROM Results2014 resu
  JOIN (
               SELECT MIN(Result) BestResult,
                      FullName,BirthDate, Gender,
                      Event, Agegroup
                 FROM Results2014
                GROUP BY FullName,BirthDate, Gender, Event, Agegroup
       ) best   
           ON  resu.Result    = best.BestResult
          AND  resu.FullName  = best.FullName
          AND  resu.BirthDate = best.BirthDate
          AND  resu.Gender    = best.Gender
          AND  resu.Event     = best.Event
          AND  resu.Agegroup  = best.Agegroup
 ORDER BY resu.Agegroup, resu.Gender, resu.Event, resu.FullName, resu.BirthDate

你明白这是如何工作的吗?您需要一个能获得最佳时间的聚合查询。然后,您需要在子句中使用该聚合查询中的列值从明细表中ON获取最佳时间的详细信息。

如果您只想报告一个事件,您可以WHERE在之前添加一个适当的子句ORDER BY,如下所示。

 WHERE resu.Event = '50m Freestyle'
   AND resu.Gender = 'M'
   AND resu.Agegroup = 'Junior'
于 2015-01-15T23:01:21.413 回答