SQL-如果不为null,请选择其他表中的列

时间:2018-08-03 10:47:21

标签: php mysql sql mysqli

我正在尝试在游戏内制作一个“食谱”系统。玩家可以拥有公司并在那里制作物品。

我目前按公司类型提取配方,但是我不知道如何编写查询,如果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个的名称,其余的可以跳过。 / p>

我有另一个表 store_items ,其中包含该项目的img和名称。我在查询时考虑了IF ELSE或CASE WHEN的问题,但是我不确定该怎么做。

类似的东西:SELECT c.img,c.name FROM store_items AS c如果a.item1_id不为NULL。

我觉得我已经接近解决方案,但是错过了最后一步。

2 个答案:

答案 0 :(得分:0)

感谢@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."';

我基本上现在正在获取所有内容,并现在在php代码中处理NULL。

答案 1 :(得分:0)

在没有看到更多信息的情况下,它不得不查看您正在尝试实现的目标,但是您可以通过使用游戏的用户输入来确定在进一步过滤之前首先需要哪些数据。试试这个:

声明@Value int 设置@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."';