当我使用运行完美的 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/