SQL查询按重复名称排序行,保持结果最低

时间:2015-01-15 22:23:09

标签: mysql dbvisualizer

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

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的知识和经验是最简单的

2 个答案:

答案 0 :(得分:1)

使用group byjoin

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;

答案 1 :(得分:0)

你陷入了nonstandard MySQL extension to GROUP BY的陷阱。

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

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

Result
Temp
FullName
Province
BirthDate
Position
Location
Date   
Event
Gender
Agegroup

所以,第一步是为每位游泳运动员找到每个赛事的最佳时间。要做到这一点,我们需要做出几个假设。

  1. 一个人由FullName,BirthDate和Gender唯一标识。
  2. 事件由事件,性别,年龄组唯一标识。
  3. 这个子查询将为每位游泳运动员提供最佳时间。

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

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

    现在的挑战是找出每个人最佳时间的情况。这些情况包括临时,省,位置,位置,日期。我们将通过原始表和虚拟表之间的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'