我有一个表格,其中包含我所有的发票项目:
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/