我有 2 个 MYSQL 表,users 和 scores。详情:
我的意图是获得 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/
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
在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
似乎Sequel的默认选择是“select*”,当您添加一些连接时会导致各种问题。至少你最终会在你的对象中得到错误的id(因为这样会返回不止一个“id”列)。做类似的事情.select("people.*")似乎可以工作,但它将传入的字符串视为一列并用引号引起来。到目前为止,我不得不恢复到裸SQL来解决这个问题,但我知道必须有更好的方法。 最佳答案 Sequel的默认行为是选择所有列,但很容易覆盖。如果您只想从单个表中选择所有列:.select(:people.*)如果您想使用文字SQL字符串:.select('people.*'.
我在postgresql中有一个表,其中包含一些汽车+1000000条记录:+----+--------+------+---------+-----------+-------------+------------+------------+|id|price|year|mileage|fuel_type|body_type|brand|model|+----+--------+------+---------+-----------+-------------+------------+------------+|1|4894|2011|121842|"Benzin"|"Sedan
我需要做这样的事情:classPlanetEdge我的表是边表,但每个顶点都是一个整数。但是,在rails中似乎不可能实现上述目标。什么可能是制作字符串列的替代方法? 最佳答案 如果您根据http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html运行rails5.0或更高版本当您需要定义具有相同值的多个枚举时,您可以使用:_prefix或:_suffix选项。如果传递的值为真,则方法的前缀/后缀为枚举的名称。也可以提供自定义值:classConversation对于上面
我有一个带有帖子和评论模型的应用程序。在我的索引操作/View中,我遍历帖子并从最近创建时间到最早创建时间显示它们。我的评论嵌套在我的帖子中,因此在我的帖子显示操作/View中,我想遍历评论并让它们显示从最近创建到最早创建的时间。如果我在我的post.rb文件中创建一个方法,我似乎只能让它工作。我有这个:post.rb:defnewest_commentsself.comments.order("created_atDESC")end在我的帖子展示View中,我可以遍历帖子评论并且效果很好:但我想在Controller层设置此功能,但我不知道如何设置。这是我在我的帖子Controlle
这是我在运行任何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
将Validates_uniqueness_of与:scope选项一起使用时,传递这样的列数组是否有效:validates_uniqueness_of:x,:scope=>[:y,:z]因为我希望:x在:y和:z的上下文中是唯一的如果不是那么你怎么能做到这一点?2个验证每个范围一个?谢谢 最佳答案 是的,它是有效的,您的语法正是实现它的方式。查看validationsdocumentationpage了解更多详情。 关于ruby-on-rails-validates_uniqueness
'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上找到一个类似的问题:
我正在使用DataTables并尝试在带有下拉列表的表中搜索结果。但是我需要搜索两个特定的列,而不是搜索一列。下面的语法适用于单列,但我该如何处理多列呢?vartable=$('#example1').DataTable();$("#filter").on('change',function(){table.column([4]).search($(this).val()).draw();});我试过这样做,但是当我使用这段代码时,它只搜索第一列中的结果,例如第4列。并忽略其余部分。table.column([4,5]).search($(this).val()).draw();正确的