Mysql 使用子项限制查询

Mysql 使用子项限制查询,mysql,sql,Mysql,Sql,假设我有一个可以用特定工具解决的谜题列表。现在,我选择我的工具,我想知道我可以解决的难题和我的列表上的工具。这是我的sql(用于mysql) 结果我得到了类似的东西 难题1,工具1,2 难题1,工具2,2 难题2,工具1,1 难题3,工具3,1 因为我有更多的工具,计数器需要知道我能更容易地解决哪个难题。不过,我不确定查询是否得到了足够的优化。我得到的结果是50行,并不代表50个可能的谜题,只是行的总和。从数学上讲,如果我使用50个工具的ID,我只会得到一个谜题 我如何设置我的查询,以获得50个

假设我有一个可以用特定工具解决的谜题列表。现在,我选择我的工具,我想知道我可以解决的难题和我的列表上的工具。这是我的sql(用于mysql)

结果我得到了类似的东西 难题1,工具1,2 难题1,工具2,2 难题2,工具1,1 难题3,工具3,1

因为我有更多的工具,计数器需要知道我能更容易地解决哪个难题。不过,我不确定查询是否得到了足够的优化。我得到的结果是50行,并不代表50个可能的谜题,只是行的总和。从数学上讲,如果我使用50个工具的ID,我只会得到一个谜题


我如何设置我的查询,以获得50个不同的拼图,而不是拼图,工具?如果我按拼图分组,我将丢失工具的id/名称!我应该运行第三个查询吗?

如果我理解,您正在寻找与给定工具集匹配的谜题。这是“集合中的集合”子查询的一个示例。解决这一问题的灵活方法是使用聚合

下面的查询将返回每个拼图的工具数量和它们的列表(逗号分隔)。对于与您的列表相匹配的谜题,它是由最多的工具以最少的顺序排列的:

SELECT p.name, p.puzzle, count(*) as numtools, group_concat(t.id) as tools
FROM puzzles p INNER JOIN
     tools_for_puzzle tfp
     ON tfp.id_puzzle = p.id INNER JOIN
     tools t
     ON t.id= tfp.id_tool
WHERE t.id IN (21,22,23,24,25,26,27)
GROUP BY p.id
ORDER BY numtools desc;

我不知道是谁干的!它解决了我的问题,并且使查询速度更快!有趣的是,似乎还有其他方法可以做到这一点。这似乎是最优雅的,只要我只需要工具来匹配。谢谢这听起来可能很愚蠢,但是否可以将其更改为noSQL查询?我正在测试这个查询,它看起来很慢,所以我想知道改变技术是否会改变速度。@mobinoob。你应该用NoSQL标签作为一个单独的问题来提问。
SELECT p.name, p.puzzle, count(*) as numtools, group_concat(t.id) as tools
FROM puzzles p INNER JOIN
     tools_for_puzzle tfp
     ON tfp.id_puzzle = p.id INNER JOIN
     tools t
     ON t.id= tfp.id_tool
WHERE t.id IN (21,22,23,24,25,26,27)
GROUP BY p.id
ORDER BY numtools desc;