使用子项限制查询

时间:2014-05-21 19:51:35

标签: mysql sql

假设我有一个可以使用某些工具解决的谜题列表。现在我选择我的工具,我想知道我可以解决哪个难题以及我的列表中的哪个工具。这是我的sql(对于mysql)

 SELECT p.name puzzle, countr.cnt, tool.id toolId,[etc]
 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
INNER JOIN
(
   select tfp2.id_puzzle, count(*) cnt from tools_for puzzle tfp2
   where tfp2.id_tool in (21,22,23,24,25,26,27) group by id_puzzle
) countr
 ON
countr.id_puzzle=tfp.id_puzzle
 WHERE
t.id IN (21,22,23,24,25,26,27)
    order by cnt desc   limit 50 

结果我得到了类似的东西 Puzzle1,Tool1,2 Puzzle1,Tool2,2 Puzzle2,Tool1,1 Puzzle3,Tool3,1

计数器需要知道我能解决哪个难题,因为我有更多的工具。不过,我不确定查询是否足够优化。我得到的结果是50行不代表50个可能的谜题,而只是行的总和。如果我使用我需要的50个工具的ID,我可以得到一个拼图。

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

1 个答案:

答案 0 :(得分:2)

如果我理解,你正在寻找与一组给定工具相匹配的谜题。这是" set-within-sets"子查询。解决此问题的灵活方法是使用聚合。

对于每个谜题,以下查询将返回工具数量及其列表(逗号分隔)。对于与您的列表匹配的谜题,它按最少的工具排序:

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;