2015-12-27 30 views
1

在我的應用程序(自從)我不得不修改的查詢看起來像這樣:MySQL的計數問題

SELECT  sql_cache distinct p.products_image, 
      p.products_subimage1, 
      pd.products_name, 
      p.products_quantity, 
      p.products_model, 
      p.products_ordered, 
      p.products_id, 
      p.products_price, 
      p.products_date_added, 
      p.products_weight, 
      p.products_length, 
      p.products_width, 
      p.products_height, 
      p.products_tax_class_id, 
      p.products_status, 
      IF(s.status, s.specials_new_products_price, NULL)    AS specials_new_products_price, 
      IF(s.status, s.specials_new_products_price, p.products_price) AS final_price 
FROM  products p 
LEFT JOIN specials s 
ON   p.products_id = s.products_id 
LEFT JOIN products_to_categories p2c 
ON   p.products_id=p2c.products_id 
LEFT JOIN products_description pd 
ON   p.products_id=pd.products_id 
INNER JOIN filter_association_products fap 
ON   p.products_id =fap.products_id 
LEFT JOIN products_attributes pa 
ON   p.products_id = pa.products_id 
WHERE  p.products_status = '1' 
AND  date_sub(curdate(),INTERVAL 3000 day) <= p.products_date_added 
AND  find_in_set(fap.filter_id,'126, 130') 
ORDER BY p.products_date_added DESC, 
      pd.products_name 

就這樣結束,對於準確的結果:

AND  fap.filter_id IN (126, 130) 
GROUP BY p.products_id 
HAVING COUNT(DISTINCT fap.filter_id) = 2; 

我有問題現在是有以下查詢使用這個新的查詢,並給我錯誤的結果。

SELECT COUNT(DISTINCT p.products_id) AS total 
FROM products p 
LEFT JOIN specials s ON p.products_id = s.products_id 
LEFT JOIN products_to_categories p2c 
ON p.products_id = p2c.products_id 
LEFT JOIN products_description pd 
ON p.products_id = pd.products_id 
INNER JOIN filter_association_products fap ON p.products_id = fap.products_id 
LEFT JOIN products_attributes pa 
ON p.products_id = pa.products_id 
WHERE p.products_status = '1' 
AND DATE_SUB(CURDATE() , INTERVAL 3000 DAY) <= p.products_date_added 
AND fap.filter_id IN (126, 130) 
GROUP BY p.products_id 
HAVING COUNT(DISTINCT fap.filter_id) =2 
ORDER BY p.products_date_added DESC , pd.products_name 

而不是給1行的所有product_id S IN原始查詢的計數的結果是,現在給多行的結果(相同數量的行爲預期的總產品數)與它們中的每一個都是數字1。 主要問題似乎是GROUP BY p.products_id HAVING COUNT(DISTINCT fap.filter_id) =2

是否有任何方法來修改原始查詢,以便在仍使用AND fap.filter_id IN (126, 130)時計數查詢將正常工作?

+0

您需要使用一個子查詢來獲得你想要的結果。 –

回答

1

正如戈登建議的那樣,使用子查詢通常應該可以工作。 由於此查詢看起來像產品列表查詢,並且因爲您使用的是osCommerce,所以當您修改查詢以使用子查詢時,您會遇到另一個核心問題: 拆分頁面結果的計數查詢將失敗,因爲它不支持子查詢。 要還解決這個問題,你需要修改核心代碼catalog/includes/classes/split_page_results.php

變化:

$count_query = tep_db_query("select count(" . $count_string . ") as total " . substr($this->sql_query, $pos_from, ($pos_to - $pos_from))); 

要:

$count_query = tep_db_query("select count(*) as total from (" . $this->sql_query . ") AS derivedtable1"); 

更多細節在這裏:http://forums.oscommerce.com/topic/290110-class-splitpageresults/

+0

非常好找!謝謝!! – CreativeMind

3

您需要使用子查詢來獲得您想要的結果:

select count(*) 
from (<old query here>) s; 

您需要在產品ID級別聚合得到滿足初始條件的產品。計算這些產品的數量需要另一個聚合。

+0

你的意思是我需要修改計數查詢(第二個)?我不能在不影響應用程序和其他不同寫入查詢的整個邏輯的情況下做到這一點。我正在尋找一種方法來修改原始查詢,以便以下查詢的計數仍能正常工作 – CreativeMind

+0

@CreativeMind。 。 。只要使用它作爲子查詢。這是最簡單的方法。 –