2013-05-13 56 views
1

我有一个称为研讨会的表格,另一个表格称为workshop_parts。MySQL加入或嵌套循环

workshop_parts中的每一行都包含一个父代ID,该父代ID引用了它的父代工场,以及该部分的各种其他数据。

我想找出最有效的方式来检索和显示我的所有数据在网站上。

我想列出研讨会信息,然后列出其所有部分。

与我现在所知道的,我只是循环所有的研讨会,然后有一个嵌套的循环遍历所有的部分。

是否有某种方式可以使用连接来一举获得所有数据,或者是嵌套循环的最佳解决方案?

+0

你在想,你应该使用JOIN正确的,这会给你沿着列出的车间信息的列表与车间零件。在某些情况下,将数据分片并将其放回客户端可能会更好,但大多数情况下,联接是更好的选择。 (除非额外的数据/有效负载大小超过了执行SQL查询与将工作卸载到客户端的速度差异)。 – shaunhusain 2013-05-13 03:38:10

回答

2

按本SO后我会做它作为一个实际的JOIN:

SQL left join vs multiple tables on FROM line?

select ws.name as ws_name, part.name as part_name, part.qty as part_quantity from workshop ws LEFT JOIN workshop_parts parts ON (ws.id = parts.workshop_id); 

LEFT JOIN将让你在任何地方的研讨会ID存在,但省去了没有匹配的车间部分。

INNER JOIN将让你只研讨会和有符合的部分(不含配件车间不会出现,也不会不工作坊的部分)

RIGHT JOIN将让你只用零件及其他零件即使车间他们没有车间。

编辑 这里是我发现思考的最佳方式: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

+1

+1,因为你的解决方案是更完整,然后我:) – Orangepill 2013-05-13 03:45:37

+0

@ user1372122两个查询之间的区别是@shaunhusain'如果他们有零件或者没有零件,那么他们会给你所有的车间......我的车间只会提供零件的车间。他是一个“左连接”,而我的是“内连接”。在左连接版本中,您可以通过检查零件的主键来识别没有零件的车间,null表示没有零件。 – Orangepill 2013-05-13 03:58:39

+0

这是有道理的,但我刚开始掌握如何使用连接。如果workshop_parts只是一个单一的值,如该部分的名称那么这将是直接的,但我需要获得每个部分的所有数据。这将如何看待联接表? 我需要别名每个部分,所以我会有东西像part1_name,part1_date,part1_description .... part2_name,part2_date,part2_description ....等等? 导致居住在该研讨会排中的研讨会的所有部件? – 2013-05-13 04:07:12

1

使用JOIN ...这将是这个样子

select ws.name as ws_name, part.name as part_name, part.qty as part_quantity from workshop ws, workshop_parts parts where (ws.id = parts.workshop_id); 
+0

我用你的答案,所以将+1,但有点不同意的细节。 **编辑在谷女孩说话,只是一个错字,既不是从山谷,也不是一个女孩** – shaunhusain 2013-05-13 03:43:25

0

SQL将是一个不错的选择,因为你编程将作出对数据库中的每个车间ID电话。更好地一次获取所有数据,然后将其显示在页面上,从而减少数据库调用。

这里是sql。

select workshop.id, workshop_parts.* 
from workshop 
left join workshop_parts 
on workshop.id=workshop_parts.workshop_id 

希望这会有所帮助。