假设我有一个可以使用某些工具解决的谜题列表。现在我选择我的工具,我想知道我可以解决哪个难题以及我的列表中的哪个工具。这是我的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 /名称!我应该运行第三个查询吗?
答案 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;