用外键的结果替换值

时间:2015-10-29 15:07:03

标签: php mysql replace alias

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

              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_1,addon_2等列中添加addon_id。

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

现在我只是将它编程到页面中,如果addon_id == 1,echo" 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个插件:(

1 个答案:

答案 0 :(得分:1)

最直接的做法是join onto the table multiple times。这有点令人讨厌,因为你会写出几次相同的东西。

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

从那里你可以查询而不需要9个重复的连接,但是你会得到每个包的每一个包的一行(所以如果它有三个插件,它将在结果中出现三次)。然后从那里你可以使用GROUP_CONCAT将插件的名称连接到一个字段中,这样每个发票只能获得一行。