2012-05-29 53 views
1

我有兩個完全相同的表 - 產品和products_temp。我想比較兩個表,我目前正在使用下面的查詢,如果每個表中沒有多少產品,那麼它的工作正常,但是我現在每個都有大約10,000個,它需要永久運行,然後隨着一個錯誤而死「 MySQL服務器已經消失'。優化比較查詢

請看看下面的查詢,並建議如何優化它

SELECT MIN(id) AS id , product_id, product_name, program_id, program_name, deeplink, price, image_url, merchant_category, category_id, category_path, brand, last_updated, tab 
      FROM (
       SELECT id , product_id, product_name, program_id, program_name, deeplink, price, image_url, merchant_category, category_id, category_path, brand, last_updated, 'Temp' AS     tab 
       FROM products_temp AS alias1 
      UNION ALL 
       SELECT id , product_id, product_name, program_id, program_name, deeplink, price, image_url, merchant_category, category_id, category_path, brand, last_updated, 'Current'     AS tab 
       FROM products AS alias2 
      )AS alias_table 
      GROUP BY id 
      HAVING COUNT(id) =1 # 
+0

當你說「比較兩個表」時,你想要做什麼*到*看看你現有的查詢,看起來你發現了表之間的*差異*(即那些只存在於一個表中的記錄,而不是其他記錄) - 但爲了清楚起見,這就是你所追求的內容? – eggyal

+0

可能重複[如何計算MySQL中的表之間的區別?](http://stackoverflow.com/questions/430922/how-to-calculate-difference-between-tables-in-mysql) – eggyal

+0

是的,獲得兩個表格之間的區別。在此查詢之前,我清空products_temp表,使用新數據填充它,然後將其與產品表進行比較,以查看哪些產品已添加(temp)/刪除(current),然後從上述結果中填充這些產品的數組查詢。 –

回答

0

您的查詢將明顯總是返回每個ID,無論是從「溫度」或「實時」表,從而恢復每一行。您可能實際上正在尋找的是......從「Temp」表中的所有記錄,它們是否已經存在於「Live」表中,或者它們是新的並且需要更新/刷新。爲了得到這個答案,我會做一個左加入類似

選擇 TMP。*, 如果(products.id IS NULL,1,0)作爲NotOnLiveFile 從 products_temp TMP 左加入產品 上tmp.ID = products.id

不需要分組,也不需要HAVING子句。如果產品已經打開文件,你想怎麼做?用Temp中的值更新實時值?如果記錄是「NotOnLiveFile」,是否要添加這些記錄?用這種方法可以在一個結果集中獲得所有你需要的東西。

如果這是您的意圖,您可以隨時進行相關更新(對於現有條目),或插入(如果尚未在活動文件中)。

+0

給你一個想法,這是一個聯屬網站。這是從源中獲取產品數據的腳本的一部分。什麼查詢應該(並且我敢肯定它)所做的是獲取產品中存在的所有產品,但不存在於products_temp(Current)中,並獲取存在於products_temp中但不存在於產品(Temp)中的所有產品。然後我做的是循環遍歷結果,如果選項卡== Current,那麼我將它添加到$ deleteArray(),如果選項卡== Temp我將它添加到$ addArray()。然後,我在實際站點數據庫(而非Feed數據庫)中爲這兩個表創建一個表,並運行一個腳本... –

+0

,然後通過添加和刪除表循環並更新主站點的實際產品表,並添加/相應地刪除產品。希望這是有道理的? –

+0

@DerekCarlisle,實際上沒有。通過創建某種圖形(由於您是年輕用戶(點數),因此可能不允許您粘貼圖形),但要顯示您正在嘗試執行的操作的上下文,爲什麼您需要一個表具有兩個記錄這個過程本身並不完全清楚,也不是你的「循環」處理插入與刪除的地方。 – DRapp