2011-09-27 68 views
2

我有兩個大表,產品(500k記錄)和store_products(> 3mm記錄)。產品是主產品,product_stores是產品的個別位置。mySQL使用另一個表中的COUNT/MIN/MAX嵌套更新

我需要從product_stores運行一個QUERY總計信息並更新相應的產品。

當,這是我們與嵌套查詢做的更小的數據集:

SELECT productid,COUNT(id) as count,MIN(price) as lowprice,MAX(price) as highprice FROM store_products 
WHILE (productid){ update product set stores = count, min = lowprice, max = highprice WHERE productid = $productid } 
GROUP BY productid 

我是相當新的嵌套的更新和不確定如何設置由聯接和組多個領域。

結構[截斷爲相關領域]:

CREATE TABLE product ( 
product_id INT UNSIGNED NOT NULL AUTO_INCREMENT,  
stores INT UNSIGNED NOT NULL DEFAULT '0',  
lowprice DECIMAL (6,2) NOT NULL DEFAULT '000.00', 
highprice DECIMAL (6,2) NOT NULL DEFAULT '000.00', 
PRIMARY KEY (product_id), 
KEY stores (stores) 
) 

CREATE TABLE store_product (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,  
product_id INT UNSIGNED NOT NULL, 
price DECIMAL(7,2) NOT NULL DEFAULT '0.00', 
PRIMARY KEY (storeproduct_id), 
KEY product_id (product_id) 
); 

字段更新:

  • 分鐘價格[由產品ID store_product記錄計數] [MIN價格,按ProductID的]
  • 最高價[產品價格的最大]
+0

[這裏是一個例子](http://stackoverflow.com/questions/7335189/update-with-inner-join-or-min/7338783#7338783)如何使用UPDATE進行連接。 –

回答

4

運行單個查詢以對此大小的表執行更新可能需要一段時間。無論如何 - 以下應該會給你你需要的東西。訣竅是別名產品表,然後使用該別名在子查詢中引用產品表。所以:

update product p 
set p.lowprice = (select min(price) from store_product sp where sp.product_id = p.product_id), 
    p.highprice = (select max(price) from store_product sp where sp.product_id = p.product_id), 
    p.stores = (select count(*) from store_product sp where sp.product_id = p.product_id) 
where product_id in (select sp.product_id from store_product sp); 

這裏的一個問題是,對於store_product表中不存在的行,存儲列不會更新爲0。爲了迎合這一點,你可以使用IFNULL在進行全局更新:

update product p 
set lowprice = ifnull((select min(price) from store_product sp where sp.product_id = p.product_id),0), 
    highprice = ifnull((select max(price) from store_product sp where sp.product_id = p.product_id),0), 
    stores = ifnull((select count(*) from store_product sp where sp.product_id = p.product_id),0); 

你可能想嘗試兩個,看看這是更快。

希望這會有所幫助!

+0

花了大約10分鐘來執行查詢,但工作完美。非常感謝! –