【问题标题】:Query-generated tables with many-to-many data fields, best practice?具有多对多数据字段的查询生成表,最佳实践?
【发布时间】:2017-05-23 04:00:22
【问题描述】:

您有两个假设的表格:

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 的数据字符串定期更新

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

【问题讨论】:

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


    【解决方案1】:

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

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


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

    例如,你会:

    • 执行查询以从第一个表中获取该数据
    • 执行一次查询以从第二个表中获取与第一个表中的数据相对应的所有数据——类似于select * from table_2 where item in ('hat', 'shoe', 'belt')
    • 在 PHP 端使用循环将第二个查询的结果“重新附加”到第一个查询的结果

    使用此解决方案,您将在 PHP 端做更多的工作,但只有 2 个查询——而不是 1 +(从第一个查询返回的行数);当您从第一个查询返回很多行时,这通常会好得多。

    【讨论】:

    • 哦!我喜欢在一个大型查询中剥离 Table2,然后让 PHP 完成所有分组和插入的想法。显然没有想到!非常感谢!
    • 不客气 :-) ;;这是我用过几次的解决方案;从 O(n) 查询到 O(constant) 通常感觉很好 ^^ (当然,不要忘记分析这两种解决方案——但通常更少的查询更好)
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多