2012-07-31 120 views
0

我有一個存儲購買的表格,以及一個存儲產品的表格。SQL JOIN查詢語法

購買的每行表可以包含最多9個產品標識(8可以是空的)

id, foo, bar, baz, product_1_id, product_2_id, product_3_id, etc... 

現在我需要查詢該購買表的所有字段,以顯示在一個html頁面。

我無法僅顯示產品ID,所以我需要在產品表中找到相應的product_name。

SQL查詢給我很難。

任何幫助將非常感激。

+2

你不應該只是有一個產品表,而不是限制購買九產品? – 2012-07-31 13:51:51

+0

您可以重新設計數據庫以使用連接表嗎? – 2012-07-31 13:52:55

+1

「購買表中的每一行最多可以包含9個產品ID(8個可以爲空)」。通常,這將存儲在單獨的表格「purchase_item」或「purchase_product」中。我猜「購買」並不是一個好名字,因爲它指的是一個單獨的項目。經典名稱是「purchase_order」和「purchase_order_item」或「purchase_order_line」。您的設計存在的問題是它不夠靈活(每次只購買多達9種產品)並且很難查詢。您需要每次購買每種潛在產品的加入。使用單獨的purchase_order_item表,您只需要一個表。 – 2012-07-31 13:53:16

回答

2

要檢索的產品名稱,我想試試這個:

SELECT t2.product_name as product_name_1, t3.product_name as product_name_2, t4.product_name as product_name_1, [...] 
FROM purchases as t1 
JOIN products as t2 ON(t1.product_1_id = t2.product_id) 
LEFT JOIN products as t3 ON(t1.product_2_id = t3.product_id) 
LEFT JOIN products as t4 ON(t1.product_3_id = t4.product_id) 
[...] 
WHERE t1.id = ... 

,但是這可能會很慢,則可能需要調整你的數據庫。

1

您需要加入產品表9次。但是在SQL你可以用這樣的考慮正常化

select id, foo, bar, baz, p1.product_name, p2.product_name, p3.product_name, 
    etc... 
from purchases as pur 
left join products as p1 on pur.product_1_id=p1.product_id 
left join products as p2 on pur.product_2_id=p2.product_id 
. 
. 
0

..

select *,PM.Product_id,P.Product_name from purchase_mst PM, product P where 
PM.Product_id1=P.Product_id1 and PM.Product_id2=P.Product_id2 etc.... 
0

有了正確的歸一化設計,你必須:產品,PURCHASE_ORDER和purchase_order_line和查詢,簡直是:

SELECT  ... 
FROM  purchase_order 
INNER JOIN purchase_order_line 
ON   purchase_order.id = purchase_order_line.purchase_order_id 
INNER JOIN product 
ON   purchase_order_line.product_id = product.id 
+0

謝謝羅蘭。我很想學習。我在哪裏可以找到關於正常化設計的信息? – laurent 2012-07-31 14:27:09

+0

網上有很多*的東西,只是谷歌它。例如,這是一個合理的開始http://databases.about.com/od/specificproducts/a/normalization.htm所以這是http://www.dreamincode.net/forums/topic/179103-relational-database -design-normalization/ – 2012-07-31 14:48:37

+0

http://www.dreamincode.net/forums/topic/179103-relational-database-design-normalization/真的很有幫助。感謝羅蘭。 – laurent 2012-07-31 15:03:05

0

我認爲如果您有一張表連接購買產品有兩列* product_id,purchase_id *。

但儘管如此,我想你可以嘗試這樣的事:

SELECT pr1.name 
FROM purchases pur1, products pr1 
WHERE pur1.product_1_id = pr1.id 
UNION ALL 
SELECT pr2.name 
FROM purchases pur2, products pr2 
WHERE pur2.product_1_id = pr2.id 
UNION ALL 
-- and so on until 
SELECT pr9.name 
FROM purchases pur9, products pr9 
WHERE pur9.product_9_id = pr9.id 

雖然這看起來很可怕,我會強烈建議重新考慮你的數據庫設計。