我有一個存儲購買的表格,以及一個存儲產品的表格。SQL JOIN查詢語法
在購買的每行表可以包含最多9個產品標識(8可以是空的)
id, foo, bar, baz, product_1_id, product_2_id, product_3_id, etc...
現在我需要查詢該購買表的所有字段,以顯示在一個html頁面。
我無法僅顯示產品ID,所以我需要在產品表中找到相應的product_name。
SQL查詢給我很難。
任何幫助將非常感激。
我有一個存儲購買的表格,以及一個存儲產品的表格。SQL JOIN查詢語法
在購買的每行表可以包含最多9個產品標識(8可以是空的)
id, foo, bar, baz, product_1_id, product_2_id, product_3_id, etc...
現在我需要查詢該購買表的所有字段,以顯示在一個html頁面。
我無法僅顯示產品ID,所以我需要在產品表中找到相應的product_name。
SQL查詢給我很難。
任何幫助將非常感激。
要檢索的產品名稱,我想試試這個:
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 = ...
,但是這可能會很慢,則可能需要調整你的數據庫。
您需要加入產品表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
.
.
..
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....
有了正確的歸一化設計,你必須:產品,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
謝謝羅蘭。我很想學習。我在哪裏可以找到關於正常化設計的信息? – laurent 2012-07-31 14:27:09
網上有很多*的東西,只是谷歌它。例如,這是一個合理的開始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
http://www.dreamincode.net/forums/topic/179103-relational-database-design-normalization/真的很有幫助。感謝羅蘭。 – laurent 2012-07-31 15:03:05
我認爲如果您有一張表連接購買和產品有兩列* 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
雖然這看起來很可怕,我會強烈建議重新考慮你的數據庫設計。
你不應該只是有一個產品表,而不是限制購買九產品? – 2012-07-31 13:51:51
您可以重新設計數據庫以使用連接表嗎? – 2012-07-31 13:52:55
「購買表中的每一行最多可以包含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