2012-07-31 30 views
1

如果查詢的結果不符合計數閾值,您可以計算查詢的結果並使其成爲動態查詢的一部分嗎?也許使用一個案例?正如你在下面看到的,我有一個很大的愚蠢的SQL查詢有很多事情(忽略日期調整部分,對不起)。有時它會從超過10k個物品的數據庫中返回少於12個結果,因爲它需要在關閉17小時內的物品。如果sql查詢計數小於

所以問題是,我可以檢查(計數?)整個查詢結果本身,並打開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 
+0

檢查mysql case函數以替換該間隔。你也可以使用存儲過程。 – Samson 2012-07-31 06:26:23

回答

0

我有一個年長的同事伸出援助之手,我們走了不同的路線。我花了小時間隔,並限制了sql查詢,並且通過ruby中的結果循環返回> 12個結果,每次增加間隔+17小時,直到我們得到+12。一旦我們達到了該閾值,就會中斷。謝謝您的幫助!

#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 
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 
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`