Mysql 您将如何缩短此查询?

Mysql 您将如何缩短此查询?,mysql,join,Mysql,Join,我知道这有点特殊,但我不知道如何使它更简单。它涉及多个连接和多个表。这给出了期望的结果,但是非常丑陋 这是我得到的。必须有一种比所有这些连接更好的方法,尤其是相同表的多个连接,但是每一个其他变化都需要很长的时间才能产生相同的结果 SET @SEARCH:="toxic +crystal"; SELECT i.itemName item, id1.preview, it.isIngredient, it.hasRecipe, i2.itemName ingredient, id2.preview,

我知道这有点特殊,但我不知道如何使它更简单。它涉及多个连接和多个表。这给出了期望的结果,但是非常丑陋

这是我得到的。必须有一种比所有这些连接更好的方法,尤其是相同表的多个连接,但是每一个其他变化都需要很长的时间才能产生相同的结果

SET @SEARCH:="toxic +crystal";
SELECT i.itemName item, id1.preview, it.isIngredient, it.hasRecipe, i2.itemName ingredient, id2.preview, it2.hasRecipe, ri.count AS needed, MATCH(i.itemName) AGAINST(@SEARCH) score
FROM recipe_detail rd
JOIN item_detail id1 ON id1.item_id = rd.output_item_id
JOIN recipe_ingredients ri ON ri.recipe_id = rd.recipe_id
JOIN item_detail id2 ON id2.item_id = ri.item_id
JOIN itemNames i ON i.itemId = id1.item_id
JOIN itemNames i2 ON i2.itemId = id2.item_id
JOIN items it ON it.item_id = i.itemId
JOIN items it2 ON it2.item_id = ri.item_id
WHERE MATCH(i.itemName) AGAINST(@SEARCH)
ORDER BY score DESC, id1.item_id;
如果需要更多的细节,尽管问

我所说的丑陋或多或少是指简化,因为我试图将此查询扩展为“递归”以查找整个成分链(以及所需的数量,但这是另一个问题)。我宁愿在一个查询中启动它,因为通过php脚本执行它似乎也需要很长时间。只是想优化一下

我可以省略itemnamesjoin,并通过另一个查询从脚本中执行该操作,但我正试图找出如何在一次操作中完成这一切。我开始觉得这是不可能的

(省略了一些不相关的字段)
示例数据 项目:

配方和配料:

recipe_id |  item_id  |  count
------------------------------
  1             2          2
  1             3          1
  2             1          4
配方详情:

recipe_id | output_item_id
--------------------------
   1             4

这样做的最终目标是允许某人选择一个项目,并获得创建该项目所需的所有内容的分层显示,因此,我试图精简内容,以便可能使用递归ish(@var method,我猜)查询一次性提取该项目,然后对其进行解析。最长的结果可能是10到12步才能到达那里。

您可以随时使用视图

CREATE VIEW view_name_goes_here AS 
SELECT i.itemName item, id1.preview, it.isIngredient, it.hasRecipe, i2.itemName ingredient, id2.preview, it2.hasRecipe, ri.count AS needed, MATCH(i.itemName) AGAINST(@SEARCH) score
FROM recipe_detail rd
JOIN item_detail id1 ON id1.item_id = rd.output_item_id
JOIN recipe_ingredients ri ON ri.recipe_id = rd.recipe_id
JOIN item_detail id2 ON id2.item_id = ri.item_id
JOIN itemNames i ON i.itemId = id1.item_id
JOIN itemNames i2 ON i2.itemId = id2.item_id
JOIN items it ON it.item_id = i.itemId
JOIN items it2 ON it2.item_id = ri.item_id

然后,您可以根据视图进行选择

这个问题怎么了?如果它工作正常并且没有引起问题,那么就让它保持原样。您能展示示例数据和预期输出吗?您所说的“丑陋”是什么意思?请使用实际描述问题所在的语言。该查询看起来尽可能简单。如果您需要将
项目
中的不同行与
项目_detail
配方_配料
连接起来,则多个连接是唯一的方法。查询看起来相当简单。天哪,如果我给你看一些我在工作中处理的事情,以及它们执行的时间。我认为你不能再简化这个查询了。虽然我的最终版本有很大的不同(做了一个恼人的递归函数,可能也会在这里结束),但对视图的查询有助于最终的输出。Thx,不知道为什么我没有想到它。
CREATE VIEW view_name_goes_here AS 
SELECT i.itemName item, id1.preview, it.isIngredient, it.hasRecipe, i2.itemName ingredient, id2.preview, it2.hasRecipe, ri.count AS needed, MATCH(i.itemName) AGAINST(@SEARCH) score
FROM recipe_detail rd
JOIN item_detail id1 ON id1.item_id = rd.output_item_id
JOIN recipe_ingredients ri ON ri.recipe_id = rd.recipe_id
JOIN item_detail id2 ON id2.item_id = ri.item_id
JOIN itemNames i ON i.itemId = id1.item_id
JOIN itemNames i2 ON i2.itemId = id2.item_id
JOIN items it ON it.item_id = i.itemId
JOIN items it2 ON it2.item_id = ri.item_id