Я пытаюсь создать "рецепт" внутри игры. Игрок может владеть компанией и заниматься ремеслом.
В настоящее время я получаю рецепты для каждого типа компании, но я не знаю, как написать запрос таким образом, что я также могу получить имена и изображения элементов, если item_id не пуст.
Это работает:
SELECT a.recipe_id,
a.item1_id,
a.item1_uses,
a.item2_id,
a.item2_uses,
a.item3_id,
a.item3_uses,
a.item4_id,
a.item4_uses,
a.item5_id,
a.item5_uses,
a.newitem_id,
a.newitem_uses,
a.craft_description,
a.craft_button
FROM
company_recipes AS a,
company_types AS b
WHERE
a.type_id = b.type_id
AND
b.type_id = '".$type."';
"
Рецепт может содержать, например, два элемента, необходимых для создания чего-то нового, но также может быть 5. Так что, если это всего лишь 2, я хочу только получить img, имя этих 2, а остальные можно пропустить.
У меня есть другая таблица store_items, которая содержит img и имя элемента. Я думал что-то вроде линий EL ELSE или CASE WHEN внутри запроса, но я не уверен, как это сделать.
Что-то вроде: SELECT c.img, c.name FROM store_items AS c IF a.item1_id не является NULL.
Я чувствую, что я близок к решению, но пропустил последний шаг.
Спасибо за советы @jarlh, я изменил код и пришел к такому результату. Если у вас есть еще несколько советов, чтобы сделать это лучше, я рад слушать. (Я все еще младший и думал сам по пробке и ошибкам, поэтому иногда у меня не было бы лучших решений... Вот почему советы очень ценятся).
SELECT cr.recipe_id,
cr.item1_id,
cr.item1_uses,
si1.name,
si1.img,
cr.item2_id,
cr.item2_uses,
si2.name,
si2.img,
cr.item3_id,
cr.item3_uses,
si3.name,
si3.img,
cr.item4_id,
cr.item4_uses,
si4.name,
si4.img,
cr.item5_id,
cr.item5_uses,
si5.name,
si5.img,
cr.newitem_id,
cr.newitem_uses,
si_new.name,
si_new.img,
cr.craft_description,
cr.craft_button
FROM
company_recipes AS cr
INNER JOIN company_types AS ct ON cr.type_id = ct.type_id
LEFT JOIN store_items AS si1 ON cr.item1_id = si1.item_id
LEFT JOIN store_items AS si2 ON cr.item2_id = si2.item_id
LEFT JOIN store_items AS si3 ON cr.item3_id = si3.item_id
LEFT JOIN store_items AS si4 ON cr.item4_id = si4.item_id
LEFT JOIN store_items AS si5 ON cr.item5_id = si5.item_id
LEFT JOIN store_items AS si_new ON cr.newitem_id = si_new.item_id
WHERE
ct.type_id = '".$type."';
Я в основном собираю все сейчас и обрабатываю NULL в php-коде.
Не видя больше информации, он должен был увидеть, чего вы пытаетесь достичь, но вы можете начать с использования пользовательской игры в игре, чтобы определить, какие данные необходимы для дальнейшей фильтрации. Попробуй это:
Объявить @Value int set @Value = @User_input --- использует то, что когда-либо пользователь игры будет
SELECT
a.recipe_id,
a.item1_id,
a.item1_uses,
a.item2_id,
a.item2_uses,
a.item3_id,
a.item3_uses,
a.item4_id,
a.item4_uses,
a.item5_id,
a.item5_uses,
a.newitem_id,
a.newitem_uses,
a.craft_description,
a.craft_button
--- you can insert more columns but i stopped here as i dont know what data you have in the other tables.
FROM
company_recipes a
INNER JOIN company_types b ON a.type_id = b.type_id
INNER JOIN store_items c ON c.type_id = b.type_id
WHERE
b.type_id = @Value; --- '".$type."';
JOIN
! Легче писать (без ошибок), легче читать и поддерживать, и легче конвертировать во внешнее соединение при необходимости.