Nawet nie muszę zaglądać do manuala.
JOIN LEFT z 2 upośledzeniami będzie wyglądało tak:
SELECT
user_box.*
gift.type,
FROM
user_box
LEFT JOIN gift ON
gift.id = user_box.1 OR
gift.id = user_box.2 OR
gift.id = user_box.3 OR
gift.id = user_box.4 OR
gift.id = user_box.5 OR
.........
gift.id = user_box.98 OR
gift.id = user_box.99 OR
gift.id = user_box.100
WHERE user_box.id = ?
Trudno to nazwać problemami raczej upośledzenia mySQL

1. Przy złączeniu trzeba wypisać pola 0-100. Zamienienie tego na SELECT ? WHERE id IN (SELECT? ) nic nie da bo pola i tak trzeba będzie wypisać (w klauzuli IN będziemy chcieli wszystkie pola BOXów oprócz id(PRIMARY) a nie da się tego zrobić inaczej niż wypisać).
Przy 2 SELECT używam pętli, więc na jedno wychodzi.
2.Tabele wynikowa będzie cholernie wielka. Napisze kilka przykładowych WIERSZÓW:
1. (ID) _ (ID_GIFT_1) ? (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _
(TYP_GIFT_1)2. (ID) _ (ID_GIFT_1) ? (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _
(TYP_GIFT_2)3. (ID) _ (ID_GIFT_1) ? (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _
(TYP_GIFT_3)....
99. (ID) _ (ID_GIFT_1) _ (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _
(TYP_GIFT_99)100. (ID) _ (ID_GIFT_1) _ (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _
(TYP_GIFT_100)JOIN LEFT ? Może tutaj jest błąd struktury bazy danych, którą trzeba inaczej zaprojektować i wtedy cały problem zniknie.
Mam użytkowników którzy mają plansze 10x10 -> na niej chowają prezenty. Pozostali gracze strzelają w pole odkrywając prezent który się tam skrywa. Zrobienie z tego 1 tabeli w której jest pole i od razu GIFT jest rozwiązaniem na siłę. Każdy strzelony GIFT jest zapisywany, wiec musiałbym po trafieniu go, przenieś do nowej tabeli.