我有一张包含所有发票项目的表格作为包裹:
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个插件:(
答案 0 :(得分:1)
最直接的做法是join onto the table multiple times。这有点令人讨厌,因为你会写出几次相同的东西。
另一种更好的方法是重组表 - 您需要另一个包含2个数据列的表:invoice_id和addon_id。然后,您需要一个auto-inc主列,或者将这两个现有列用作双主键。所以这是一个多对多的联结表。
从那里你可以查询而不需要9个重复的连接,但是你会得到每个包的每一个包的一行(所以如果它有三个插件,它将在结果中出现三次)。然后从那里你可以使用GROUP_CONCAT将插件的名称连接到一个字段中,这样每个发票只能获得一行。