使用url param按sql查询排序

时间:2012-07-26 05:37:42

标签: mysql ruby-on-rails ruby ruby-1.8.7

我在下面有这个巨大的丑陋查询,我想在目录视图中按它排序。想象http://wow.dev:3000/catalog_items?&order=deals之类的东西。百万感谢您的任何意见或答案。

select 100 - round((current_price / item.estimated_price)*100) as percent, item.cached_thumbnail_url, item.item_id, it.name,
          ci.current_price, ci.close_date
           from item
           join catalog_item ci on ci.item_id = item.item_id
           join item_translations as it on (it.item_id = item.item_id)
           where  (100 - round((current_price / item.estimated_price)*100)) > 49 and 
           item.estimated_price > 0 and ci.current_price > 0 and ci.close_date > now() and item.active = 1 and ci.active = 1 and 
           (current_price / estimated_price) < 1
           order by (ci.close_date < DATE_ADD(now(), INTERVAL 17 hour))  and (item.estimated_price - current_price) desc
           limit 12

2 个答案:

答案 0 :(得分:0)

不确定这与ROR有什么关系,但无论如何:

  1. 您的SELECT子句中有100 - round((current_price / item.estimated_price)*100) as percent,但无论如何在WHERE条件中使用相同的表达式。

  2. item.estimated_price可以小于零吗?如果不是item.estimated_price > 0条件过多,如果它为零,则(100 - round((current_price / item.estimated_price)*100)) > 49条件将为假

  3. 由于同样的原因,(current_price / estimated_price) < 1过多

  4. 因此您可以更清楚地重写查询:

    select (100 - round((current_price / item.estimated_price)*100)) as percent,
       item.cached_thumbnail_url, item.item_id, it.name,
       ci.current_price, ci.close_date
    from item
       join catalog_item ci on ci.item_id = item.item_id
       join item_translations as it on (it.item_id = item.item_id)
    where
       percent > 49
       and ci.current_price > 0
       and ci.close_date > now()
       and item.active = 1
       and ci.active = 1
    order by
       (ci.close_date < DATE_ADD(now(), INTERVAL 17 hour))
       and (item.estimated_price - current_price) desc
    limit 12
    

    这并没有改善这种情况,但如果不了解有关数据库架构的更多原因,我就不能说更多。

    BTW你问题中的链接不起作用(这显然是你的本地链接)

答案 1 :(得分:0)

建立二进制代码的答案,你可以尝试在ARel中包装你的查询,然后在你的控制器动作中你在params散列中传递的字段上订购,如下所示:

class ItemsController < ApplicationController
  ...
  def index
    @items = Item.select(%{(100 - round((current_price / item.estimated_price)*100)) as percent,
               item.cached_thumbnail_url, item.item_id, it.name,
               ci.current_price, ci.close_date}).
             joins('join catalog_item ci on ci.item_id = item.item_id').
             joins('join item_translations as it on (it.item_id = item.item_id)').
             where('percent > 49 and ci.current_price > 0 and ci.close_date > now() and item.active = 1 and ci.active = 1').
             order(%{(ci.close_date < DATE_ADD(now(), INTERVAL 17 hour))
               and (item.estimated_price - current_price) desc)}).limit(12)
    @items = @items.order(params[:order]) if params[:order]
    ...
end

修改

正如二进制代码所指出的那样,您可能希望通过将主查询移到操作之外来使控制器代码更清晰,可能是Item模型中的方法,并确保仍然返回{{1来自它的对象(就像当前语句一样),所以你可以稍后链接额外的Relation

order