2015-10-29 5 views
2

У меня есть таблица со всеми моими деталями счета-фактуры в качестве пакетов:Заменить значение с результатом иностранных Ключа

   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, 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

Самый прямой способ сделать это - join onto the table multiple times. Это немного нагло, потому что вы будете писать почти то же самое 9 раз.

Другой, лучший способ - перестроить ваши таблицы - вам нужна другая таблица с двумя столбцами данных: invoice_id и addon_id. Затем вам нужен либо основной столбец auto-inc, либо использовать оба этих столбца в качестве двойного первичного ключа. таблица соединений «все-ко-многим».

Оттуда вы можете запросить без 9 повторяющихся объединений, но вы получите строку каждого пакета для каждого его аддона (так что если у него есть три аддона, он будет отображаться три раза в результатах). И затем оттуда вы можете использовать GROUP_CONCAT, чтобы объединить имена аддонов в одно поле, чтобы вы получили только одну строку на счет-фактуру.

+0

Мне нравится ваша вторая идея, однако я думаю, что я, вероятно, захочу держаться подальше от отдельной таблицы, потому что это упростит добавление и удаление invoice_items, потому что мне придется добавить несколько строк в разные таблицы при создании, а также поиск и удаление записей из таблицы аддонов при удалении invoice_item. Возможно, это того стоит. Большое спасибо за идеи! Как бы я разобрал информацию из объединений, чтобы узнать, какой результат является результатом addon_id, если я использую ваше первое предложение? –

+0

Вы бы назвали биты в первом SELECT с номерами. Таким образом, JOINs будут иметь псевдоним addson1, addons2 и т. Д., Затем в SELECT вы добавите addons1.addon_name AS addon1, addons2.addons_name AS addon2 и т. Д. – Octo

+0

Я не уверен, полностью ли я понимаю (я действительно новичок в PHP и mysql ... как это будет выглядеть как запрос? –

Смежные вопросы