【问题标题】:Replace value with Foreign Key's result用外键的结果替换值
【发布时间】:2016-01-29 19:26:46
【问题描述】:

我有一张表格,里面有我所有的发票项目作为包裹:

              Table: invoice_items

invoice_item_id | package_id | addon_1 | addon_2 | addon_3 | ...
----------------|------------|---------|---------|
        1       |     6      |    2    |    5    |    3    |

然后是我的另一张桌子:

              Table: addons

 addon_id |  addon_name  |        addon_desc        |
----------|--------------|--------------------------|
    1     | Dance Lights | Brighten up the party... |
    2     | Fog Machine  | Add some fog for an e... |

我不想占用空间将插件名称存储在我的 invoice_items 表中,我只想将 addon_id 包含在 addon_1、addon_2 等列中。

在查询 invoice_item 行时如何获取插件的名称?

现在我只是将它编程到页面中,如果 addon_id == 1,则回显“Dance Lights”等,但我想在查询中执行此操作。这是我当前的查询:

                  $invoice_items_SQL = "

                    SELECT invoice_items.*, packages.*
                    FROM `invoice_items`

                      INNER JOIN packages ON invoice_items.invoice_item_id = packages.package_id

                    WHERE `event_id` = \"$event_id\"

                    ";

所以我可以用包做到这一点,但这只是因为每行只有一个 package_id,但最多有 9 个插件:(

【问题讨论】:

    标签: php mysql replace alias


    【解决方案1】:

    最直接的方法是join onto the table multiple times。不过这有点不妥,因为你几乎会写 9 次相同的东西。

    另一种更好的方法是重组表 - 您需要另一个具有 2 个数据列的表:invoice_id 和 addon_id。然后,您需要一个 auto-inc 主列,或者将这两个现有列用作双主键。所以这是一个多对多连接表。

    从那里您可以在不进行 9 次重复连接的情况下进行查询,但是对于每个包的每个插件,您都会得到一行(因此,如果它有三个插件,它将在结果中出现 3 次)。然后从那里您可以使用 GROUP_CONCAT 将插件的名称连接到一个字段中,这样您每张发票只能得到一行。

    【讨论】:

    • 我喜欢你的第二个想法,但我想我可能不想使用单独的表,因为这会使添加和删除 invoice_items 变得更加困难,因为我必须创建时在不同的表中添加多行,并在删除 invoice_item 时从插件表中搜索和删除记录。也许这将是值得的。非常感谢你的想法!如果我使用您的第一个建议,我将如何从联接中整理信息以知道哪个结果来自哪个 addon_id?
    • 您可以用数字为第一个 SELECT 中的位起别名。因此,JOIN 将别名为 addson1、addons2 等,然后在 SELECT 部分中您可以使用 addons1.addon_name AS addon1、addons2.addons_name AS addon2 等等。
    • 我不确定我是否完全理解(我真的是 PHP 和 mysql 的新手......这看起来像一个查询吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多