我正在尝试构建一个简单的网站,比较一些人的比赛的最佳时间,但是,我在使用distinct
时遇到了很多困难,这似乎让我感到意外问题...
我有两个数据库 - Result
和Athlete
(运动员有很多结果)
我试图确定每个运动员参加特定比赛的最快时间,然后将它们整理好。为了做到这一点,我需要创建一个独特的运动员名单列表,但它们也必须按照增加时间的顺序(即更慢)。我目前正在使用:
<% @filtered_names = Result.where(:event_name => params[:justevent]).joins(:athlete).order('performance_time_hours ASC').order('performance_time_mins ASC').order('performance_time_secs ASC').order('performance_time_msecs ASC').select('distinct athlete_id') %>
这似乎有效,但是,我发现如果results
数据库中的最后一个条目是所有运动员中最慢的,那么这名运动员最终会在我的名单末尾,即使是一个以前的结果是有史以来记录最快的!
有人能告诉我distinct
是否以某种奇怪的方式运作以及我如何解决这个问题?如果底部结果是最快的,那么脚本可以完美地工作......
为了完整起见,我需要此信息才能运行以下代码:
<% @filtered_names.each do |filtered_name| %>
<% @currentathleteperformance = Result.where(:event_name => params[:justevent]).where(:athlete_id => filtered_name.athlete_id).order('performance_time_hours ASC').order('performance_time_mins ASC').order('performance_time_secs ASC').order('performance_time_msecs ASC').first() %>
<% @currentathlete = Athlete.where(:id => filtered_name.athlete_id).first() %>
<td><%= @currentathleteperformance.performance_time_mins %>:<%= @currentathleteperformance.performance_time_secs %>:<%= @currentathleteperformance.performance_time_msecs %> </td>
<td><%= @currentathleteperformance.wind_speed %></td>
<td><%= @currentathleteperformance.athlete_name %></td>
<td><%= @currentathlete.gender %></td>
<td><%= @currentathlete.sec %></td>
<td><%= @currentathleteperformance.competition_name %></td>
<td><%= @currentathleteperformance.round %></td>
<td><%= @currentathleteperformance.position %></td>
<td><%= @currentathleteperformance.performance_date %></td>
<td><%= @currentathlete.coach_name %></td>
<% end %>
答案 0 :(得分:0)
我会使用data type time
的1列performance_time
来替换所有:
performance_time_hours
performance_time_mins
performance_time_secs
performance_time_msecs
或interval
如果一次演出可能超过24小时。
我对Ruby语法并不擅长,但是获得你想要的东西的查询可能看起来像这样 - 假设运动员每次比赛可以多次执行且event_name
是唯一的:
SELECT athlete_id, min(performance_time) AS min_performance_time
FROM result
WHERE event_name = params[:justevent]
GROUP BY athlete_id
ORDER BY min(performance_time), athlete_id
我另外按athlete_id
排序,但这只是一种以稳定方式打破关系的武断措施。
DISTINCT
只需根据每组重复项的排序顺序获取第一个行。要使用DISTINCT
获得相同的结果,您需要一个子选择:
SELECT athlete_id, performance_time
FROM (
SELECT DISTINCT ON (athlete_id)
athlete_id, performance_time
FROM result
WHERE event_name = params[:justevent]
ORDER BY athlete_id, performance_time
) a
ORDER BY performance_time, athlete_id
您必须ORDER BY athlete_id
才能获得不同的运动员,并且无法在同一查询级别上按最低performance_time
排序。因此,您必须将SELECT DISTINCT
的结果放在子选择中,然后按照时间进行分类。