2010-02-22 21 views
2

你有两个假设表:具有多对多数据字段的查询生成表,最佳实践?

TABLE 1 
[id] [item] [amount] [cost] 
1  hat  20  10 
2  shoe 7   45 
3  belt 2   25 

TABLE 2 (many to many) 
[item] [color] 
hat  blue 
hat  red 
hat  yellow 
shoe black 
shoe white 
etc. etc. 

,当你运行一个查询,您要输出,包括所有的数据都像这样的列表:

[ITEM] [AMOUNT] [COST] [AVAILABLE COLORS] 
hat  20  10  blue, red, yellow 
shoe 7   45  black, white 
etc. 

如果颜色不目前,它将是一个查询来从一个表中获取所有信息并在循环中处理该数组。但是,以适应TABLE 2我能想到的两种方法可以做到这一点:

蛮力:运行查询,为每一个回归得到的数据从TABLE 2,加逗号,并从TABLE 1插入到结果阵列,然后输出HTML表格

丑陋的解决方法:添加一个新列Table 1并定期与数据串从Table 2幕后

...有一个更好的办法,仅次于更新?

回答

2

如果您正在使用MySQL,那么GROUP_CONCAT函数可能会让您感兴趣。

例如,见这个问题:Can I concatenate multiple MySQL rows into one field?


否则,您所描述的“蛮力”解决方案通常是所使用的一个 - 一个可能的优化是只做1查询来获取从第二线一次对应于第一个表中所有行的表。

举例来说,你最好:

  • 做查询,以从第一台
  • 获得这些数据做一个查询来获取第二个表对应于数据从第一个表中的所有数据 - 像select * from table_2 where item in ('hat', 'shoe', 'belt')
  • 使用循环在PHP端从第二查询从第一个

“重新连接”的结果的结果通过这一解决方案,你”我会在PHP方面做更多的工作,但只有2个查询 - 而不是1 +(从第一个查询返回的行数);当你有很多从第一个查询返回的行时,它通常好得多。

+0

哦!我*喜欢*在一个大型查询中剥离Table2然后让PHP完成所有分组和插入的想法。显然没有想到这一点!非常感谢你! – Drew 2010-02-22 06:32:46

+0

不客气:-) ;;这是我用过几次的解决方案;从O(n)查询到O(常量)往往感觉很好^^ *(当然,不要忘记分析这两种解决方案 - 但通常较少的查询更好)* – 2010-02-22 06:37:24