我有一个包含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的知识和经验是最简单的
答案 0 :(得分: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;
答案 1 :(得分:0)
你陷入了nonstandard MySQL extension to GROUP BY的陷阱。
(我不打算使用所有那些完全限定的列名;这是不必要的和冗长的。)
我认为你正在寻找每个游泳运动员在特定赛事中的最佳时间,并且你试图从所谓的非正规化表中提取它。您的表看起来像这些列。
Result
Temp
FullName
Province
BirthDate
Position
Location
Date
Event
Gender
Agegroup
所以,第一步是为每位游泳运动员找到每个赛事的最佳时间。要做到这一点,我们需要做出几个假设。
这个子查询将为每位游泳运动员提供最佳时间。
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'