2013-02-02 215 views
-1

我正在使用3 API(Linkshare,佣金交匯處和亞馬遜)的價格比較網站上工作。在數據庫中,表格字段彼此不相關。但產品名稱與其他表格相似。如何比較三款表產品?

第1步:我想合併所有三個表並顯示在單個表中。這可能嗎?

第2步:比較這三個表,並列出前端的產品。

注:我在三個表的主鍵是: 佣金結:SKU 亞馬遜:援助 LinkShare的:SKUNUMBER

這是我的數據庫結構。 enter image description here

我的表爲3API的DDL結構。亞馬遜表結構

CREATE TABLE `amazon` (`aid` bigint(20) NOT NULL AUTO_INCREMENT, `network` varchar(230) NOT NULL, `merchant_id` varchar(250) NOT NULL, `merchant_name` varchar(250) NOT NULL, `merchant_logo` mediumtext NOT NULL, `name` varchar(250) NOT NULL, `brand` varchar(250) NOT NULL, `asin` varchar(250) NOT NULL, `upc` varchar(150) NOT NULL, `ean` varchar(300) NOT NULL, 
`image` mediumtext NOT NULL, `description` text NOT NULL, `url` mediumtext NOT NULL, `price` decimal(10,0) NOT NULL, `listprice` decimal(10,0) NOT NULL, `lowest_usedprice` decimal(10,0) NOT NULL, `shipping` varchar(130) NOT NULL, `currency` varchar(5) NOT NULL, `search_keyword` text NOT NULL, `search_maxprice` varchar(230) NOT NULL, `search_minprice` varchar(230) NOT NULL, `date` datetime NOT NULL, `catagory` varchar(255) NOT NULL, PRIMARY KEY (`aid`)) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=latin1 

佣金結的表結構。

CREATE TABLE `cjfeeds` (`PROGRAMNAME` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `PROGRAMURL` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `CATALOGNAME` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL, `LASTUPDATED` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `NAME` varchar(160) COLLATE utf8_unicode_ci DEFAULT NULL, `KEYWORDS` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `DESCRIPTION` varchar(3000) COLLATE utf8_unicode_ci DEFAULT NULL, `SKU` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `MANUFACTURER` varchar(160) COLLATE utf8_unicode_ci DEFAULT NULL, `MANUFACTURERID` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, `UPC` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `ISBN` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, 
`CURRENCY` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, `SALEPRICE` decimal(10,2) DEFAULT NULL, `PRICE` decimal(10,2) DEFAULT NULL, `RETAILPRICE` decimal(10,2) DEFAULT NULL, 
`FROMPRICE` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, `BUYURL` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL, `IMPRESSIONURL` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `IMAGEURL` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `ADVERTISERCATEGORY` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `THIRDPARTYID` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, `THIRDPARTYCATEGORY` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `AUTHOR` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL, `ARTIST` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL, `TITLE` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL, `PUBLISHER` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL, `LABEL` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL, `FORMAT` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, `SPECIAL` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, `GIFT` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, `PROMOTIONALTEXT` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `STARTDATE` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `ENDDATE` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, 
`OFFLINE` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, `ONLINE` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, `INSTOCK` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL, 
`CONDITION` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL, `WARRANTY` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `STANDARDSHIPPINGCOST` decimal(10,2) DEFAULT NULL, PRIMARY KEY (`SKU`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

爲LinkShare的表結構:

CREATE TABLE `linkshare` (`PRODUCTID` int(100) unsigned NOT NULL, `PRODUCTNAME` varchar(255) NOT NULL, `SKUNUMBER` varchar(200) NOT NULL, `PRIMARYCATAGRY` varchar(255) NOT NULL, `SECONDARYCATAGRY` varchar(2000) NOT NULL, `PRODUCTURL` varchar(2000) NOT NULL, `PRODUCTIMAGEURL` varchar(2000) NOT NULL, `BUYURL` varchar(2000) NOT NULL, `SHORTPRODUCTDESCRIPTION` varchar(2000) NOT NULL, `LONGPRODUCTDESCRIPTION` varchar(2000) NOT NULL, `DISCOUNT` float(8,2) unsigned NOT NULL, 
`DISCOUNTTYPE` varchar(255) NOT NULL, `SALEPRICE` float(8,2) unsigned NOT NULL, `RETAILPRICE` float(8,2) unsigned NOT NULL, 
`BEGINDATE` datetime NOT NULL, `ENDDATE` datetime NOT NULL, `BRAND` varchar(255) NOT NULL, `SHIPPING` int(255) unsigned NOT NULL, `KEYWORDS` varchar(500) NOT NULL, `MANUFACTURERPART` varchar(100) NOT NULL, `MANUFACTURERNAME` varchar(250) NOT NULL, 
`SHIPPINGINFORMATION` varchar(50) NOT NULL, `AVAILABLITY` varchar(50) NOT NULL, `UNIVERSALPRODUCTCODE` varchar(15) NOT NULL, 
`CLASSID` float(8,2) unsigned NOT NULL, `CURRENCY` varchar(3) NOT NULL, `M1` varchar(2000) NOT NULL, `PIXEL` varchar(255) NOT NULL, `MISCELLANEOUSATTRIBUTE` varchar(255) NOT NULL, `ATTRIBUTE1` varchar(255) NOT NULL, `ATTRIBUTE2` varchar(255) NOT NULL, `ATTRIBUTE3` varchar(255) NOT NULL, `ATTRIBUTE4` varchar(255) NOT NULL, `ATTRIBUTE5` varchar(255) NOT NULL, ATTRIBUTE6` varchar(255) NOT NULL, `ATTRIBUTE7` varchar(255) NOT NULL, `ATTRIBUTE8` varchar(255) NOT NULL, `ATTRIBUTE9` varchar(255) NOT NULL, `ATTRIBUTE10` varchar(255) NOT NULL, UNIQUE KEY `PRODUCTID` (`PRODUCTID`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 

如何解決這個問題,並請提供我一個有用的意見。

+3

如果您沒有任何方法來加入這些表,您如何期望合併它們? – sgeddes

+1

在3 API中,SKU編號是相同的.....所以只有我需要合併它們....... –

回答

1

最適合你的方法是一個存儲過程,其中:

  1. 創建臨時表進行比較:

    DROP TABLE IF EXISTS comparison_table; 
    
    CREATE TEMPORARY TABLE `comparison_table` (
        `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'Primary key', 
        `name` VARCHAR(255) NOT NULL COMMENT 'Product name', 
        `origin` VARCHAR(10) NOT NULL COMMENT 'Original website id, i.e. AZ, LS, CJ', 
        `sku` VARCHAR(10) NOT NULL COMMENT 'SKU on the original website', 
        `price` FLOAT NOT NULL COMMENT 'Price on the original website', 
        PRIMARY KEY (`id`) 
    ); 
    
  2. 用原始3個表中的數據填充此表格:

    INSERT INTO `comparison_table` (`name`, `origin`, `sku`, `price`) 
    SELECT `az`.`name`, 'AZ', `az`.`aid`, `az`.`price` 
    FROM `amazon` `az` 
    WHERE `az`.`name` IS NOT NULL AND `az`.`aid` IS NOT NULL AND `az`.`price` IS NOT NULL; 
    
    INSERT INTO `comparison_table` (`name`, `origin`, `sku`, `price`) 
    SELECT `cj`.`name`, 'CJ', `cj`.`sku`, `cj`.`price` 
    FROM `cjfeeds` `cj` 
    WHERE `cj`.`name` IS NOT NULL AND `cj`.`sku` IS NOT NULL AND `cj`.`price` IS NOT NULL; 
    
    INSERT INTO `comparison_table` (`name`, `origin`, `sku`, `price`) 
    SELECT `ls`.`productname`, 'LS', `ls`.`skunumber`, `ls`.`retailprice` 
    FROM `linkshare` `ls` 
    WHERE `ls`.`productname` IS NOT NULL AND `ls`.`skunumber` IS NOT NULL AND `ls`.`retailprice` IS NOT NULL; 
    

因此,您將獲得包含所有有趣數據的臨時表。這個表就像一個緩存,每次觸摸任何原始表時應該更新。

然後,你只需從comparison_table中選擇任何你想要的東西,並通過originsku加入必要的原始表格。例如:

SELECT `ct`.`id`, `ct`.`name`, `ct`.`price`, 
    CASE `ct`.`origin` 
     WHEN 'AZ' THEN `az`.`impressionurl` 
     WHEN 'CJ' THEN `cj`.`url` 
     WHEN 'LS' THEN `ls`.`producturl` 
    END `url` 
FROM `comparison_table` `ct` 
LEFT JOIN `amazon` `az` ON (`ct`.`origin` = 'AZ' AND `ct`.`sku` = `az`.`aid`) 
LEFT JOIN `cjfeeds` `cj` ON (`ct`.`origin` = 'CJ' AND `ct`.`sku` = `cj`.`sku`) 
LEFT JOIN `linkshare` `ls` ON (`ct`.`origin` = 'LS' AND `ct`.`sku` = `ls`.`skunumber`) 
WHERE `ct`.`name` = 'YOUR PRODUCT NAME' 
ORDER BY `ct`.`price` 
+0

嗨@Viacheslav Dobromyslov其工作完美...你是偉大的... –

+0

我面臨一個問題....當我執行插入查詢意味着它不能插入記錄在臨時。表..如果我想插入其他地方的記錄..我可以做什麼...?有可能@Viacheslav Dobromyslov? –

+1

我需要你的表格'DDL來回答這個問題。 –

2

如果你沒有這些表格之間的任何關係,但你有相同的數據列,那麼難看的方法是.. UNION。至於你提到的product names是一種常見的列...

Select product_name from t1 
Union 
Select product_name from t2 
.... 
+2

請檢查此[文章以更好地瞭解UNION規則](http:// www.mysqltutorial.org/sql-union-mysql.aspx),特別是你應該如何將表中剩餘的非公共列包含在合併表中:-)' – bonCodigo

+1

hi @ bonCodigo..i需要合併三個不同的桌子和單獨的桌子的地方,否則我需要在前臺展示來自3桌子的產品,這有可能嗎? –

+2

@ViacheslavDobromyslov猜你不會把上面的評論發給我;)好的,是的,OP的DDL在那裏,我讓我暫停。如果沒有適當的表格模式,很難前進。 – bonCodigo