定义列出不同项目的顺序

时间:2012-02-05 13:34:30

标签: sql ruby-on-rails ruby-on-rails-3 distinct

我正在尝试构建一个简单的网站,比较一些人的比赛的最佳时间,但是,我在使用distinct时遇到了很多困难,这似乎让我感到意外问题...

我有两个数据库 - ResultAthlete(运动员有很多结果)

我试图确定每个运动员参加特定比赛的最快时间,然后将它们整理好。为了做到这一点,我需要创建一个独特的运动员名单列表,但它们也必须按照增加时间的顺序(即更慢)。我目前正在使用:

 <% @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 %>

1 个答案:

答案 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的结果放在子选择中,然后按照时间进行分类。