2012-12-20 28 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