У меня есть таблица со всеми пунктами моего счета в виде пакетов:
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 дополнений 🙁
Самый прямой способ сделать это присоединиться к столу несколько раз. Это немного странно, потому что вы напишите почти одно и то же 9 раз.
Другой, лучший способ реструктурировать ваши таблицы — вам нужна другая таблица с двумя столбцами данных: invoice_id и addon_id. Затем вам понадобится либо первичный столбец с автоматическим включением, либо оба существующих столбца в качестве двойного первичного ключа. Так что это таблица соединений многих ко многим.
Оттуда вы можете выполнять запросы, не имея 9 повторяющихся объединений, но вы получите строку каждого пакета для каждого имеющегося у него дополнения (поэтому, если у него есть три дополнения, оно появится в результатах три раза). И затем оттуда вы можете использовать GROUP_CONCAT, чтобы объединить имена надстроек в одно поле, так что вы получите только одну строку на счет-фактуру.
Других решений пока нет …