2012-12-20 27 views
1

我想弄清楚如何使用一個表格JOIN來獲取可供客戶搜索的車輛製造,模型,年份和TRIMS標準的列表從。MySQL JOIN許多表格以獲得一個表格的標準列表

已經有主密鑰表,從該管理員從一系列車輛選項選擇並輸入關於該產品的PRODUCT表這些車輛相關的信息。

我想現在生成一個購物者列表,該列表僅反映可用的車輛詳細信息選項 - 基於管理員已輸入產品的表格。

我一直在循環/遍歷品牌型號TRIMS與PHP和搜索產品表中的產品表中的品牌型號YEAR TRIM類型的存在表。但是,這大約需要800個個人對「產品」表的調用。

據瞭解,這是而不是的最佳做法,可能會導致各種問題 - 許多調用數據庫的方式,並沒有效率。

有人告訴我在另一個問題

https://stackoverflow.com/questions/13960571/sanity-check-mysql-whats-reasonable-800-calls-to-the-database-in-one-second

,這可以使用JOIN WHERE 陳述一個調用來完成。

我之前使用過表格連接,但沒有看到如何通過一次調用這些許多MAKS,MODELS,YEARS,TRIMS來生成購物者可用的MAKS,MODELS,YEARS和TRIMS標準的列表從中選擇。

我將不勝感激任何我可以在這裏瞭解該從你的例子:)

這裏是增加車輛的相關細節,以產品流入記錄管理員主密鑰選擇表的例子:


表:不做

| Id | MAKE  | // Admin table for selecting products related vehicle make 
------------------ 
| 1 | FORD  | 
| 2 | CHEV  | 
| 3 | GMC  | 
| 4 | HONDA  | 
etc. 

表:FORD

| Id | MODEL  | // Admin table for selecting products related vehicle model 
------------------ 
| 1 | F150  | 
| 2 | ESCAPE | 
| 2 | EXPLORER | 
etc. 

表:FORD_F150_YEARS_TRIMS

| Id | YEARS|     TRIMS      | // Admin table for selecting products related vehicle year and trim(s) 
-------------------------------------------- 
| 1 | 1999 | 1999_SPORT+1999_SPORTRAC+1999_XLT+1999_XLS | 
| 2 | 2000 | 2000_XLT+2000_XLS+2000_LTD+2000_EDDIE_BAUER | 
| 3 | 2001 | 2001_SPORTRAC+2001_XLT+2001_LTD    | 
etc. 

這裏是產品表管理員正在進入的產品/車輛的詳細信息:

表:PROD UCTS

| PRODUCT_ID | MAKE   |   MODELS   |  YEARS  |          TRIMS            | 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| 123456  | FORD FORD GMC | F150 ESCAPE CANYON | 2000 2001 1999 | FORD_F150_1999_SPORT+FORD_F150_1999_SPORTRAC+GMC_CANYON_1999_LTD+GMC_CANYON_1999_LTD | 
| 123457  | FORD GMC CHEV | F150 EXPLORER SILVERADO | 2000 2010 2010 | FORD_F150_2001_XLT+FORD_F150_2001_LTD+GMC_CANYON_2010_XLT+CHEV_SILVERADO_1500_2010_LTD | 
etc. 

我想要做的是 - 進行查詢的產品表在那裏我可以產生一個表或僅車型,有產品的名單。

所以,如果有PRODUCTS產品表適合一個2001 FORD F150SPORTRAC裝飾 - 然後我不想給購物者SPORTRAC的選擇與2001年FORD F150但我想給他們2001年福特F150的選擇與XLT + LTD

所以真的 - 我只是想消除對購物者的不存在的車輛產品細節的選擇。

有人告訴我,這可以在一個MySQL的調用的數據庫中進行。我被告知,而不是循環所有的品牌,型號修剪,並單獨調用PRODUCTS表 - 我可以以某種方式使用表連接和while語句獲得所有潛在的列表MAKE MODEL TRIMS根據產品表中的內容,可以爲客戶提供的選擇只有

我看到了如何通過對產品表進行一次調用,然後循環並用PHP清除重複結果。但也有成千上萬的產品,這些可能格羅 - 所以我期待實現這一目標的最佳實踐方法。

+1

嗯...你的表沒有外鍵?你確定這是桌子的整個結構Make,Ford和FORD_F150_YEARS_TRIMS?你有每個品牌的桌子嗎?福特桌子,本田桌子等? –

+0

麥克布蘭特的回答非常好。在最初的問題中,我假定這將是您正在使用的模式類型。 –

+0

嗨米克爾 - 是的,有一張福特桌,一張本田桌和一張雪佛蘭桌等等。每個包含產品可能創建的年份和修剪。 – KDawg

回答

1

嗯,看來你首要的問題是,你有這些不同的表,但你是不是在一個關係的方式使用它們。你應該花一些時間學習如何正確地規範你的表格。作爲一般指導原則,您應該真正思考如何通過正確的主鍵和外鍵使用來表達您與另一個人之間的真實世界項目/屬性並表達這種關係。

您的產品應通過各種主鍵ID與產品,型號,裝飾等相關,而不是複製產品表中的數據。例如,您也不應該有'福特'牌桌,而應該只有一個'模型'牌桌。

正如一個樣品,我可能有這樣

models 
--------- 
model_id 
make_id 
model 

makes (Make is really just a property of the model of car, and could possibly be de-normalized into models table. Here I am showing it as separate table to show a fully normalized example.) 
--------- 
make_id 
make 

trims ('SPORT+XLS' unless those represent a specific trim combination. Each different trim package should have its own row) 
-------- 
trim_id 
trim 

products (I am assuming that a model and year define a product, by looking at your example data) 
-------- 
product_id 
year 
model_id 


product_trims (many-to-many table expressing relation of products to trims - you could have multiple rows with same product_id and different trim id) 
------------- 
product_id 
trim_id 

的模式。如果你真的想定義爲一年,模型相結合的產物,和裝飾,可以消除product_trims表只是有這樣

product 
------------- 
product_id 
year 
model_id 
trim_id 

然後,您可以跨查詢修訂產品表連接,以獲得您所需要的數據。例如,假設用戶已經指定了模型和年份。該查詢可能如下所示(假設顯示出使用這兩種產品和products_trim表)

SELECT p.product_id, p.year, ma.make, mo.model, t.trim 
FROM 
products AS p 
INNER JOIN models AS mo ON p.model_id = mo.model_id 
INNER JOIN makes AS ma ON mo.make_id = ma.make_id 
INNER JOIN product_trims AS pt ON p.product_id = pt.product_id 
INNER JOIN trims AS t ON pt.trim_id = t.trim_id 
WHERE p.year = '?' AND p.model_id = ? 

當然,你需要正確索引的所有備案的用於連接和任何WHERE或ORDER BY條件。

+0

非常感謝您抽出寶貴時間回覆 - 我一直與您分享product_trims到product_id和trim_id。我想我搞砸了我的表格 - 對不起。每種產品實際上可能存在多對多的關係,因爲每種產品都可以有多個MAKES,MODELS和TRIMS。我會修改我的表格示例 - 但我想我會看到你要去的地方。我應該有一個使用主鍵ID的TRIMS/product_id和Models/Product_id表等。 – KDawg

+0

我學習了關係數據庫 - 不管你信不信 - 和表連接。但無法看到如何加入多個表。而且我明白你對外鍵和主鍵等的意見。我認爲我在使用變量值作爲javascript值,然後HTML值。使用'FORD'和'F150'作爲主鍵值,然後使用PHP將它們寫入javascript值,然後將這些javascript值寫爲HTML'id'值和文本值供人查看。我知道,我很瘋狂,但這似乎不那麼稱呼數據庫。 – KDawg