mysql - Rails Advance 查询 CASE WHEN 方法不起作用

标签 mysql ruby-on-rails rails-activerecord

当我使用运行完美的 mysql 时,是否有人可以在这里向我建议 Find_by_sql 查询的解决方案。但是当我把它转换成事件记录时它并没有显示确切的结果。首先,我使用 find_by_sql 尝试了以下代码:

    @message3 = Message.find_by_sql(["SELECT u.id,c.m_id,u.name,u.email
 FROM messages c, users u
 WHERE (CASE 
 WHEN c.user_one = :id
 THEN c.user_two = u.id
 WHEN c.user_two = #{current_user.id}
 THEN c.user_one= u.id
 END )
 AND (
 c.user_one ='1'
 OR c.user_two ='1'
 )
 Order by c.m_id DESC Limit 20", {:id => current_user.id}])

当我使用此查询时,我得到了我想要的确切值,但是当我以事件记录方式执行此操作时,它运行不佳所以这是我在事件记录样式中尝试过的代码:

@message = Message.select(:user_one, :user_two).distinct.where("user_one = ? OR user_two = ? " , current_user ,current_user)
    @m1 = Message.joins(:user).select("users.id,messages.m_id,users.name,users.email").where("CASE WHEN messages.user_one = #{current_user.id} THEN messages.user_two = users.id WHEN messages.user_two = #{current_user.id} THEN messages.user_one = users.id END").where("messages.user_one = 1 OR messages.user_two = 1 ").order("messages.m_id DESC")

当我运行这个查询时,我得到这个生成查询:

SELECT users.id,messages.m_id,users.name,users.email FROM `messages` INNER JOIN `users` ON `users`.`id` = `messages`.`user_one` WHERE (CASE WHEN messages.user_one = 1 THEN messages.user_two = users.id WHEN messages.user_two = 1 THEN messages.user_one = users.id END) AND (messages.user_one = 1 OR messages.user_two = 1 )  ORDER BY messages.m_id DESC

这两个查询看起来都一样但是当我使用 find_by_sql 方法时我得到两个结果但是当我重新查询事件记录时它只显示一个当我将生成的 sql 粘贴到 mysql 那里我也得到相同的结果如果任何人都可以帮助我理解这两个查询之间的区别以及我该如何解决这个问题我的意思是我需要事件记录中 find_by_sql 的结果。

最佳答案

根据查询,您的方案是选择 user_one 是当前用户或 user_two 是当前用户的消息。所以你可以简单地做这个而不是复杂的查询

Message.where("messages.user_one = ? OR messages.user_two =?", current_user, current_user).order("m_id ASC").limit(20)

现在为用户添加详细信息。您可以遍历 View 中的消息并为每条消息获取用户并显示它。或者您可以创建哈希数组并将其返回给 View 。

关于mysql - Rails Advance 查询 CASE WHEN 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736224/

相关文章:

ruby-on-rails:播种数据策略(或将测试数据加载到开发人员数据库中)

ruby-on-rails - 在 Rails before_save 方法中将多个属性大写

ruby-on-rails - 立即保存相互指向的 ActiveRecord 关联

MYSQL - 没有得到正确的数据 MAX

MySQL 高效加入 "in"没有重复

php - 如何将信息添加到采购表中

ruby-on-rails - 如何在 Rails 应用程序中测试 PG::QueryCanceled(由于超时)错误?

php - 谷歌图表 : Object 2013-07-25 has no method 'getTime

ruby-on-rails - Rails 4. 少数模型的不同路由(相关和不相关)

ruby-on-rails - CanCan 的 Spree 订单