我有一个高级搜索表单,它提供了多种过滤搜索的方法。这是一个简化的想法(不包括关键字文本输入或日期范围搜索或其他选择菜单):
Topic:
<select><option>any</option><option>all</option></select>
[] Aging
[] Environment
[] Health
[] Hunger
[] Poverty
Document type:
<select><option>any</option><option>all</option></select>
[] Case Study
[] Policy Brief
[] Whitepaper
如果有人在选择多个主题或文档类型时选择“任何”,则查询需要包括,例如,主题 =“老化”或主题 =“健康”。
如果有人在选择多个主题或文档类型时选择“全部”,则查询需要包括,例如,主题 =“老化”和主题 =“健康”。
我们默认在这些不同的过滤器之间使用“AND”。因此,当您搜索归类为 Aging 的所有文档以及归类为白皮书的所有文档时,查询为:topic = "Aging" AND doctype = "whitepaper"。
问题:当搜索“任何”时,我们有一个查询有效。但是当搜索“all”时,根据 MySQL 的“EXPLAIN”命令,我们有一个“不可能的 WHERE”。:(
以下是当有人为主题和文档类型选择“任何”时有效的查询:
SELECT
DISTINCT *
FROM research
JOIN link_resource_doctype ON link_resource_doctype.resource_id = research.research_id
JOIN doctype ON doctype.id = link_resource_doctype.doctype_id
JOIN link_resource_issue_area ON link_resource_issue_area.resource_id = research.research_id
JOIN issue_area ON issue_area.id = link_resource_issue_area.issue_area_id
WHERE approved = '1'
AND (doctype.identifier = 'case_study' OR doctype.identifier = 'whitepaper')
AND (issue_area.identifier = 'aging' OR issue_area.identifier = 'health')
这是相同的查询,当有人为主题和文档类型选择“全部”时,它不起作用(如果有人只选择主题或文档类型,这也不起作用):
SELECT
DISTINCT *
FROM research
JOIN link_resource_doctype ON link_resource_doctype.resource_id = research.research_id
JOIN doctype ON doctype.id = link_resource_doctype.doctype_id
JOIN link_resource_issue_area ON link_resource_issue_area.resource_id = research.research_id
JOIN issue_area ON issue_area.id = link_resource_issue_area.issue_area_id
WHERE approved = '1'
AND (doctype.identifier = 'case_study' AND doctype.identifier = 'whitepaper')
AND (issue_area.identifier = 'aging' AND issue_area.identifier = 'health')
可能的解决方案,但有一个问题:我在 Stackoverflow 上看到了这篇文章——选择属于多个类别的行——其中包含一个查询,我认为当有人选择“全部”时可能会解决我们的问题。这里是:
SELECT
DISTINCT *
FROM research
JOIN link_issue_area ON link_issue_area.resource_id = research.research_id
JOIN link_doctype ON link_doctype.resource_id = research.research_id
WHERE issue_area.identifier IN ('aging', 'health')
AND
doctype_id.identifier IN ('case_study', 'whitepaper')
GROUP BY research.research_id
HAVING COUNT(DISTINCT issue_area.identifier) = 2
AND
COUNT(DISTINCT doctype.identifier) = 2
问题:这个查询似乎对“任何”或“全部”都有效,除了一个问题。假设文档归类为老化、健康和贫困,但搜索的人只勾选了老化和健康。被勾选的两个主题和未勾选的 Poverty 分类下的文档不会出现在搜索结果列表中。我认为这是因为 HAVING COUNT (DISTINCT issue_area.identifier) = 2 - 2 不包括任何实际具有大于 2 的 COUNT 的文档。有解决方法吗?或者在这里使用更好的查询?
非常感谢任何见解,想法,帮助!谢谢!
这是一个 SQLfiddle,它也能做到这一点:http ://sqlfiddle.com/#!2/847362/1