我有一个包含 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 ;
乍一看,它似乎工作正常,我得到了所有正确的值,但我似乎在"位置"列中得到了一个与数据库表中不同的(错误)值。所有其他值似乎都是正确的。对我做错了什么有什么想法吗?
我目前正在使用连接到 mysql 数据库的 dbVisualizer。另外,我对sql的知识和经验是最低限度的
使用 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;
你已经落入了非标准MySQL扩展到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
这将为您提供一个虚拟表,其中包含每个人在每个事件中的最快结果(使用前面提到的人员和事件的定义)。
现在的挑战是找出每个人最好时间的情况。这些情况包括临时、省份、职位、位置、日期。我们将在原始表和虚拟表之间使用 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
子句中使用该聚合查询中的列值,以便从详细信息表中获取最佳时间的详细信息。
如果您只想报告一个事件,则可以在ORDER BY
之前包含适当的WHERE
子句,如下所示。
WHERE resu.Event = '50m Freestyle'
AND resu.Gender = 'M'
AND resu.Agegroup = 'Junior'