5

首先,我的長度道歉。這有點複雜(至少對我而言)。複雜的MySQL數據結構/操縱問題

背景數據庫:

我有一個產品,變量和價格表。 「產品」是關於產品的主要信息(描述,標題等)。 「價格」包含每個價格的信息(價格,成本,所需的最小數量,運輸成本等),因爲某些產品可以有多個價格(例如,10「小部件與12」小部件的價格不同) 。 「變量」是不會改變價格的產品的變體,例如顏色,尺寸等。

最初(當我在7年前建立這個數據庫時)我將變量信息存儲在第一個價格中以管道分隔的格式顯示同一產品的價格清單(是的,我知道,badbadbad)。這個工作一般,但我們一直有一個問題,雖然,這裏有時變量將不是所有的價格之間是一致的。

例如,窗口小部件(產品)可以是10" 或12" 和售價分別爲$ 10和$ 20(價格)。然而,儘管10" 微件可以是在藍色和紅色(變量)可用,12" 插件僅在紅色可用。我們通過在「紅色」(10「ONLY)」等不一致的變量中添加了一點括號聲明來改善這個問題。這類作品,但客戶並不總是那麼聰明,而且當客戶選擇時,很多時間都致力於修復錯誤紅色的12「小部件。

我已經負責現代化數據庫,並決定將這些變量放在自己的表中,使它們更具動態性,更容易與某些價格相匹配,並且保留更多的防僞存貨(可以不要想象惡夢)。

我的第一步是寫一個存儲過程對我的測試數據庫(因爲當我做了轉換)來處理所有已有變量到一個新的變量表(和標籤表,但是這並不重要,我不我認爲)。我有效地解析出來的變量,並使用正確的產品ID和他們最初在變量表相關聯的產品ID列出它們。但是,我意識到這只是問題的一部分,因爲我(至少對於數據庫的初始轉換)希望將每個變量列爲與給定產品的每個價格相關聯。

要做到這一點,我創建了另一個表,就像這樣:

 
tblvariablesprices 
variablepriceid | variableid | priceid | productid 

這是一個多到多用變量表。

問題:

我現在的問題是,我不知道如何創建行。我可以創建一個左連接上我的價格和變量表得到(我認爲)所有必要的數據,我只是不知道如何去通過它。我的sql是(mysql 5.0):

SELECT p.priceid, p.productid, variableid, labelid 
FROM tblprices p 
LEFT JOIN tblvariables v ON p.priceid = v.priceid 
ORDER BY productid, priceid 

這將使我得到每一個priceid和productid以及任何匹配的變量和標籤id。這是在某些情況下不錯的,比如當我有這樣的:

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) --- another price for product 

因爲現在我知道我需要創建一個記錄priceid 2和variableids 10,11,12,然後也爲priceid 3該產品。不過,我也從中得到數據集產品沒有變量,產品具有一個價,多變量,產品具有多種價格和沒有變量的結果,例如:

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) 
4  | 8   | (null)  | (null) --- 1 price no variables 
5  | 9   | 13   | 5  --- mult vars, 1 price 
5  | 9   | 14   | 5 
5  | 9   | 15   | 6 
5  | 9   | 16   | 6 
6  | 10  | (null)  | (null) --- mult price, no vars 
7  | 10  | (null)  | (null) 
8  | 10  | (null)  | (null) 

綜合以上數據集,我想添加條目到我tblpricesvariables表像這樣:

 
variablepriceid | variableid | priceid | productid 
1    | 10   | 2  | 7 
2    | 11   | 2  | 7 
3    | 12   | 2  | 7 
4    | 10   | 3  | 7 
5    | 11   | 3  | 7 
6    | 12   | 3  | 7 
7    | 13   | 5  | 9 
8    | 14   | 5  | 9 
9    | 15   | 5  | 9 
10    | 16   | 5  | 9 

我有成千上萬的記錄過程,所以很明顯這樣做手工,這是沒有答案的。任何人都可以至少指出我正確的方向,如果不能拿出一個可以處理這種類型的操作的sproc?我也歡迎有關如何更好地組織和/或構建這些數據的意見。

非常感謝您閱讀這些內容並幫助我。

回答

2

如何:

SELECT DISTINCT b.variableid, a.priceid, a.productid 
FROM tblprices AS a 
JOIN tblprices AS b ON a.productid = b.productid 
WHERE b.labelid IS NOT NULL 
ORDER BY priceid; 

+------------+---------+-----------+ 
| variableid | priceid | productid | 
+------------+---------+-----------+ 
|   10 |  2 |   7 | 
|   11 |  2 |   7 | 
|   12 |  2 |   7 | 
|   10 |  3 |   7 | 
|   11 |  3 |   7 | 
|   12 |  3 |   7 | 
|   13 |  5 |   9 | 
|   14 |  5 |   9 | 
|   15 |  5 |   9 | 
|   16 |  5 |   9 | 
+------------+---------+-----------+ 

插入tblvariables就留給讀者做練習;)

1

我認爲這應該工作:

SELECT v.variableid,p.productid,p.priceid FROM tblvariables V,tblprices p WHERE v.priceid IN(SELECT s.priceid FROM tblprices小號 WHERE s.productid = p.productid);

下一次,你可以拋出創建並插入語句來複制你的設置?謝謝。

+0

燁,創造並插入的確會節省一些時間 – chris 2011-02-10 20:52:07

+0

感謝這麼多院長......這是也是一個合適的解決方案(獲得正確的數據),但克里斯的需要大約7秒才能執行,你的需要大約1-2分鐘。謝謝您的幫助! – Jason 2011-02-10 21:01:00