MySQL ORDER BY多列ASC和DESC

Tan*_*iet 30 mysql sql-order-by multiple-columns

我有2个MYSQL表,用户分数.详情:

  • 用户表:

在此输入图像描述

  • 分数表:

在此输入图像描述

我的目的是获得20个用户列表,其中有点字段排序DESC(降序)组合avg_time字段排序ASC(升序).我使用查询:

SELECT users.username, scores.point, scores.avg_time
FROM scores, users
WHERE scores.user_id = users.id
GROUP BY users.username
ORDER BY scores.point DESC, scores.avg_time
LIMIT 0, 20
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

结果是错误的,因为第一行恰好是point = 100和avg_time = 60.

我想要的结果是:

username    point    avg_time
demo123      100        60
demo123456   100       100
demo         90        120
Run Code Online (Sandbox Code Playgroud)

我尝试了多次不同的查询,但结果仍然是错误的.你能给我一些解决方案吗?

提前致谢!

DRa*_*app 26

好的,我认为我理解你现在想要的东西,让我在查询之前澄清确认.您希望每个用户拥有1条记录.对于每个用户,您需要他们的BEST POINTS得分记录.在每个用户的最佳分数中,您希望平均时间最长的分数.一旦你拥有所有用户"最佳"价值,你希望最终结果首先按最佳点排序......几乎就像比赛的排名.

所以现在查询.如果上述陈述是准确的,您需要从获得每个人的最佳点/平均时间开始,并为该条目指定"等级".使用MySQL @变量很容易做到这一点.然后,只需包含一个HAVING子句,只保留每个人排名为1的记录.最后按最佳点和最短平均时间应用顺序.

select
      U.UserName,
      PreSortedPerUser.Point,
      PreSortedPerUser.Avg_Time,
      @UserRank := if( @lastUserID = PreSortedPerUser.User_ID, @UserRank +1, 1 ) FinalRank,
      @lastUserID := PreSortedPerUser.User_ID
   from
      ( select
              S.user_id,
              S.point,
              S.avg_time
           from
              Scores S
           order by
              S.user_id,
              S.point DESC,
              S.Avg_Time ) PreSortedPerUser
         JOIN Users U
            on PreSortedPerUser.user_ID = U.ID,
      ( select @lastUserID := 0,
               @UserRank := 0 ) sqlvars 
   having
      FinalRank = 1
   order by
      Point Desc,
      Avg_Time
Run Code Online (Sandbox Code Playgroud)

结果由SQLFiddle处理

注意,由于获得答案所需的内联@variables,每行末尾有两个额外的列.这些只是"遗留",可以在您尝试的任何实际输出演示文稿中被忽略...或者,您可以将整个事物包装在一个以上的级别上,以获得您想要的几个列

select 
      PQ.UserName,
      PQ.Point,
      PQ.Avg_Time
   from
      ( entire query above pasted here ) as PQ
Run Code Online (Sandbox Code Playgroud)

  • 事实上你是一个非常聪明的开发者。由于我的英语词汇量很少,我很难解释我的意图。这就是我需要的答案。感谢您在回答中清楚地解释!:) (2认同)