具有多对多数据字段的查询生成表,最佳实践?

时间:2010-02-22 06:20:23

标签: php html-table many-to-many

您有两个假设表:

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后面的数据字符串进行更新

......有更好的方法,对吧?

1 个答案:

答案 0 :(得分: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 +(从第一个查询返回的行数);当你从第一个查询返回很多行时,这通常要好得多。