1

クエリの結果をカウントし、カウントのしきい値を満たしていない場合にクエリの一部を動的にすることはできますか?多分ケースを使用していますか?以下に示すように、私は多くのことが起こっている大きなばかげたSQLクエリを持っています(日付調整部分を無視してください、申し訳ありません)。クローズから17時間以内にアイテムが必要なため、10,000を超えるアイテムのデータベースから12未満の結果が返される場合があります。

したがって、問題は、クエリ全体の結果をチェック(カウント)し、その17時間のパラメーターをより大きな数に開いて、少なくとも12の結果を返すことができるかということです。

前もって感謝します。

SELECT 100 - round((current_price / item.estimated_price)*100) as percent, item.cached_thumbnail_url, item.item_id, current_price, close_date, catalog_item_id FROM catalog_item AS ci JOIN item on item.item_id = ci.item_id
 JOIN item_translations it ON (it.item_id = item.item_id) WHERE ((100 - round((current_price / item.estimated_price)*100)) > 49 AND
 item.estimated_price > 0 AND
 current_price > 0 AND
 ci.close_date > DATE_ADD(NOW(), interval 14400 second) AND
 item.active = 1 AND
 ci.active = 1 AND
 (current_price / estimated_price) < 1 AND 
 (ci.close_date < DATE_ADD(DATE_ADD(NOW(), interval 14400 second), INTERVAL 17 HOUR))) ORDER BY (item.estimated_price - current_price) DESC LIMIT 12
4

3 に答える 3

0

よくわかりませんが、次のような方法を試すか、サブクエリを使用できます。

SET @cnt = 0;

SELECT ...
FROM catalog_item AS ci
    JOIN item on item.item_id = ci.item_id
    JOIN item_translations it ON (it.item_id = item.item_id)
WHERE ((100 - round((current_price / item.estimated_price)*100)) > 49 AND
        ...
     (ci.close_date < DATE_ADD(DATE_ADD(NOW(), interval 14400 second), INTERVAL IF(@cnt < 12, 20, 17) HOUR)))
    AND (SELECT @ids := @cnt + 1)
ORDER BY (item.estimated_price - current_price) DESC LIMIT 12
于 2012-07-31T04:21:02.330 に答える
0

先輩に手を貸してもらい、別の道を歩みました。SQLクエリから時間間隔と制限を取り、ルビーの結果をループして> 12の結果を返し、+ 12になるまで間隔を+ 17時間増やします。そのしきい値に達すると、ブレークします。助けてくれてありがとう!

 #DEALS TAB BEGIN
  def self.deals
    #calculate the raw percentage, minus that from 100 to show percentage off
    options = {: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, ci.catalog_item_id",

               :from => "catalog_item AS ci",
               :joins => "JOIN item on item.item_id = ci.item_id
                                       JOIN item_translations it ON (it.item_id = item.item_id)",
               :order => "(item.estimated_price - current_price) DESC",

               :conditions => "(100 - round((current_price / item.estimated_price)*100)) > 49 AND
                                  item.estimated_price > 0 AND
                                  ci.current_price > 0 AND
                                  ci.close_date > DATE_ADD(NOW(), interval #{-1*Time.now.utc_offset} second) AND
                                  item.active = 1 AND
                                  ci.active = 1 AND
                                  (current_price / estimated_price) < 1 "}

    #loop adding 17 hours each pass until < 12 results show
    catalog_items = CatalogItem.all(options)
    _deals = []
    if catalog_items.present?
      last_close_date =  CatalogItem.first(:conditions => options[:conditions], :from => options[:from], :joins => options[:joins], :order =>  "ci.close_date DESC", :select => options[:select]).close_date
      start_time = Time.now
      interval = 17.hours
      end_time = start_time + interval
      min_needed_for_view = 12
      until _deals.size >= min_needed_for_view or last_close_date < start_time
        catalog_items.each do |ci|
          if ci.close_date < end_time && ci.close_date > start_time
            _deals.push(ci)
            break if _deals.size >= min_needed_for_view
          end
        end
        start_time = end_time
        end_time += interval
      end
    end
    _deals
  end
于 2012-08-01T03:26:57.737 に答える
0
`SELECT 100 - round((current_price / item.estimated_price)*100) as percent, item.cached_thumbnail_url, item.item_id, current_price, close_date, catalog_item_id FROM catalog_item AS ci JOIN item on item.item_id = ci.item_id
 JOIN item_translations it ON (it.item_id = item.item_id) WHERE ((100 - round((current_price / item.estimated_price)*100)) > 49 AND
 item.estimated_price > 0 AND
 current_price > 0 AND
 ci.close_date > DATE_ADD(NOW(), interval 14400 second) AND
 item.active = 1 AND
 ci.active = 1 AND
 (current_price / estimated_price) < 1 AND
CASE WHEN ( SELECT COUNT(1) FROM catalog_item)>1000 
THEN  (ci.close_date < DATE_ADD(DATE_ADD(NOW(), interval 14400 second), INTERVAL 17 HOUR)))
--and so on 
END  ORDER BY (item.estimated_price - current_price) DESC LIMIT 12`
于 2012-07-31T06:32:45.647 に答える