草庐IT

MySQL ORDER BY 多列 ASC 和 DESC

coder 2023-06-10 原文

我有 2 个 MYSQL 表,usersscores。详情:

  • 用户表:

  • 成绩表:

我的意图是获得 20 个用户列表,这些用户列表具有 point 字段排序 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

结果是:

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

我想要的结果是:

username    point    avg_time
demo123      100        60
demo123456   100       100
demo         90        120

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

提前致谢!

最佳答案

好的,我想我现在明白你想要什么了,让我在询问之前澄清一下。您希望每个用户有 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

Results as handled by SQLFiddle

注意,由于获得答案需要内联@variables,因此每行末尾有两列额外的列。这些只是“剩余的”,可以在您尝试执行的任何实际输出演示中忽略...或者,您可以将整个内容包装到一个更高的级别,以获得您想要的几列

select 
      PQ.UserName,
      PQ.Point,
      PQ.Avg_Time
   from
      ( entire query above pasted here ) as PQ

关于MySQL ORDER BY 多列 ASC 和 DESC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13694907/

有关MySQL ORDER BY 多列 ASC 和 DESC的更多相关文章

  1. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

  2. ruby-on-rails - 在 Ruby 或 Rails 中,hash.merge({ :order => 'asc' }) can return a new hash with a new key. 什么可以返回带有已删除键的新散列? - 2

    在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para

  3. ruby - 续集选择了太多列 - 2

    似乎Sequel的默认选择是“select*”,当您添加一些连接时会导致各种问题。至少你最终会在你的对象中得到错误的id(因为这样会返回不止一个“id”列)。做类似的事情.select("people.*")似乎可以工作,但它将传入的字符串视为一列并用引号引起来。到目前为止,我不得不恢复到裸SQL来解决这个问题,但我知道必须有更好的方法。 最佳答案 Sequel的默认行为是选择所有列,但很容易覆盖。如果您只想从单个表中选择所有列:.select(:people.*)如果您想使用文字SQL字符串:.select('people.*'.

  4. ruby - 如何在 postgresql 中创建多列推荐引擎? - 2

    我在postgresql中有一个表,其中包含一些汽车+1000000条记录:+----+--------+------+---------+-----------+-------------+------------+------------+|id|price|year|mileage|fuel_type|body_type|brand|model|+----+--------+------+---------+-----------+-------------+------------+------------+|1|4894|2011|121842|"Benzin"|"Sedan

  5. ruby-on-rails - 多列的相同枚举值 - 2

    我需要做这样的事情:classPlanetEdge我的表是边表,但每个顶点都是一个整数。但是,在rails中似乎不可能实现上述目标。什么可能是制作字符串列的替代方法? 最佳答案 如果您根据http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html运行rails5.0或更高版本当您需要定义具有相同值的多个枚举时,您可以使用:_prefix或:_suffix选项。如果传递的值为真,则方法的前缀/后缀为枚举的名称。也可以提供自定义值:classConversation对于上面

  6. ruby-on-rails - 在 Rails 中添加 created_at DESC 功能 - 2

    我有一个带有帖子和评论模型的应用程序。在我的索引操作/View中,我遍历帖子并从最近创建时间到最早创建时间显示它们。我的评论嵌套在我的帖子中,因此在我的帖子显示操作/View中,我想遍历评论并让它们显示从最近创建到最早创建的时间。如果我在我的post.rb文件中创建一个方法,我似乎只能让它工作。我有这个:post.rb:defnewest_commentsself.comments.order("created_atDESC")end在我的帖子展示View中,我可以遍历帖子评论并且效果很好:但我想在Controller层设置此功能,但我不知道如何设置。这是我在我的帖子Controlle

  7. ruby - Sinatra::Application:Class 的未定义方法 `desc' - 2

    这是我在运行任何rake命令时遇到的错误:undefinedmethod'desc'forSinatra::Application:Class#app.rbrequire'sinatra'require'sinatra/activerecord'require'sinatra/contrib'get'/'doputs"HelloWorld"end#config.rurequire"./app"runSinatra::Application#Rakefilerequire'./app'require'sinatra/activerecord/rake'#Gemfilesource'htt

  8. ruby-on-rails - validates_uniqueness_of 范围为多列 - 2

    将Validates_uniqueness_of与:scope选项一起使用时,传递这样的列数组是否有效:validates_uniqueness_of:x,:scope=>[:y,:z]因为我希望:x在:y和:z的上下文中是唯一的如果不是那么你怎么能做到这一点?2个验证每个范围一个?谢谢 最佳答案 是的,它是有效的,您的语法正是实现它的方式。查看validationsdocumentationpage了解更多详情。 关于ruby-on-rails-validates_uniqueness

  9. ruby-on-rails - 以 DESC 排序集合 - 2

    'event',:collection=>@events.sort_by(&:event_at)%>此代码显示按ASC排序的集合,但我想按DESC排序此集合。我怎样才能做到这一点? 最佳答案 如http://guides.rubyonrails.org/active_record_querying.html所述@events.order(event_at::desc) 关于ruby-on-rails-以DESC排序集合,我们在StackOverflow上找到一个类似的问题:

  10. javascript - DataTables - 使用单个下拉列表在多列中搜索 - 2

    我正在使用DataTables并尝试在带有下拉列表的表中搜索结果。但是我需要搜索两个特定的列,而不是搜索一列。下面的语法适用于单列,但我该如何处理多列呢?vartable=$('#example1').DataTable();$("#filter").on('change',function(){table.column([4]).search($(this).val()).draw();});我试过这样做,但是当我使用这段代码时,它只搜索第一列中的结果,例如第4列。并忽略其余部分。table.column([4,5]).search($(this).val()).draw();正确的

随机推荐