Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何";“向前推进”;具有给定值的记录?_Mysql_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Mysql 如何";“向前推进”;具有给定值的记录?

Mysql 如何";“向前推进”;具有给定值的记录?,mysql,ruby-on-rails,ruby,ruby-on-rails-3,Mysql,Ruby On Rails,Ruby,Ruby On Rails 3,我正在使用RubyonRails3.2.9和MySQL。我有一个带有用户id属性的文章模型(此属性表示关联作者用户的外键-id),我想检索为给定作者“排序”的文章。也就是说,鉴于我有以下记录: <#Article id: 1, title: "Title 1", user_id: 1> <#Article id: 2, title: "Title 2", user_id: 2> <#Article id: 3, title: "Title 3", user_id:

我正在使用RubyonRails3.2.9和MySQL。我有一个带有
用户id
属性的
文章
模型(此属性表示关联作者用户的外键-
id
),我想检索为给定作者“排序”的文章。也就是说,鉴于我有以下记录:

<#Article id: 1, title: "Title 1", user_id: 1>
<#Article id: 2, title: "Title 2", user_id: 2>
<#Article id: 3, title: "Title 3", user_id: 1>
<#Article id: 4, title: "Title 4", user_id: 3>
<#Article id: 5, title: "Title 5", user_id: 1>
...
<#Article id: N, title: "Title N", user_id: M>

换言之,我希望检索所有文章,但按“优先级”排序:由给定作者创建的文章首先返回,然后返回所有其他文章(也就是说,我希望“推进”由给定作者创建的文章)

我怎样才能做到


注意:我正在寻找RubyonRails实现,可能是通过这个方法实现的。

试试这个:

Select 
*
from 
myTable
order by 
user_id, id
对于给定的用户id:

Select 
*
from 
myTable
where user_id='?'
order by 
user_id, id

您的示例并不那么清楚,因为您正在搜索user_id 1,而按user_id进行的正常排序将把这些放在第一位。我相信你的意思是:

SELECT id, title, user_id
FROM myTable
ORDER BY CASE WHEN user_id = @search_id THEN 1 ELSE 2 END, user_id
在上面的示例中,
@search\u id
应为1。

请尝试:

Article.where(user_id: 1).order("user_id ASC").order("id ASC")
或者这个:

Article.where(user_id: 1).order("user_id ASC, id ASC")

Rails中的查询可能如下所示:

Article.order(Article.send(:sanitize_sql, ["IF(user_id = ?, 1, 2)", params[:user_id]]))
IF(user_id=?,1,2)
为订购物品返回1或2
sanitize\u sql
是一种私有方法,用于清理参数

如果params[:user_id]始终为整数,则查询可以简化为:

Article.order("IF(user_id = #{params[:user_id].to_i}, 1, 2)")

您如何为给定的
用户id
订购文章?您最后的代码仅检索给定(一)作者创建的文章。我期待着检索所有的文章,但使这些与一个给定的作者优先顺序。换句话说,我希望获得由给定作者创建的第一篇文章,然后是其他所有文章。OP需要所有结果,按用户_id,id排序。您的解决方案将只选择由用户_id=>1发布的文章。我希望为给定作者“排序”文章,但还需要检索其他作者创建的文章。你的代码只检索给定作者创建的文章。我不理解你想做什么。你说的“for”是什么意思?每个人都认为你想搜索。换句话说,我想检索所有文章,但要为给定作者排序“priority”,其中排序“priority”is:首先是给定作者创建的所有文章,然后是所有其他文章。对不起,我不知道要做什么。你如何将你的答案与问题联系起来?顺便说一句:“简化”查询对于SQL注入是否危险?是的,简化版本非常危险。在处理用户提供的数据时,您永远不能假设任何事情。我不会把它作为解决方案。。。第一个更好。我不认为对任何字符串调用
会导致任何危险。您能举个例子吗?order by子句是“CASE WHEN user_id=@search_id然后1 ELSE 2 END,user_id”,所以您应该能够在排序中使用该字符串和参数?
Article.order("IF(user_id = #{params[:user_id].to_i}, 1, 2)")