php - 用外键的结果替换值

标签 php mysql replace alias

我有一个表格,其中包含我所有的发票项目:

              Table: invoice_items

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

然后是我的另一张 table :

              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,则回显“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 个插件 :(

最佳答案

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

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

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

关于php - 用外键的结果替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33417882/

相关文章:

sql - 如何做相当于 "limit distinct"?

java - 如何在Java中用单词替换字符

php - 在 phpmailer 主题中使用 Acute 时出现问题

PHP 5.x strtotime 无法正确解析英国格式 d-m-y

Python脚本从文件读取数据并将其存储在mysql表中

mysql - SQL更新自动化

php - 可移动类型的带有php的静态页面

php - Symfony 4 生产模式错误处理页面内存耗尽

Java的 String .replaceFirst 不起作用,我不知道它是一个错误还是我做错了

excel - 查找并替换公式中的文本