2012-05-29 52 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