2012-07-31 100 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`