【问题标题】:SQL - select column inside different table if not nullSQL - 如果不为空,则选择不同表中的列
【发布时间】:2018-08-03 10:47:21
【问题描述】:

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

我目前按公司类型获取食谱,但我不知道如何编写查询,如果 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 个,我只想获取这 2 个的 img 和名称,其余的可以跳过。

我有一个不同的表 store_items,其中包含商品的 img 和名称。我在想一些类似于查询中的 IF ELSE 或 CASE WHEN 的东西,但我不确定我会怎么做。

类似:SELECT c.img, c.name FROM store_items AS c IF a.item1_id is not NULL。

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

【问题讨论】:

  • 今日提示:切换到现代、明确的JOIN 语法!更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接。
  • 另一个提示:选择有意义的表别名,例如 cr 而不是 for company_recipes 的 a。
  • 如果可能,请添加一些示例数据。
  • @jarlh - 至少她没有使用 'join' 作为表别名。我昨天在工作中看到的:(
  • @Deloryan:如果您输入“关系数据库规范化”,您会在 Google、Yahoo 或 Duckduckgo.com 中找到很多内容,这里有一些可以帮助您开始:studytonight.com/dbms/database-normalization.phpen.wikipedia.org/wiki/Database_normalizationsupport.microsoft.com/en-us/help/283878/…

标签: php mysql sql mysqli


【解决方案1】:

感谢@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。

【讨论】:

    【解决方案2】:

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

    声明@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."'; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多