重新思考后重新形成的答案
原始答案将起作用,但正如您所指出的,它将多次运行原始搜索查询并消耗大量时间来处理。产生相同结果的替代方法可能更快、更容易编码。@JEES 在此页面上的其他答案中暗示了答案:
SELECT keywords.tag as Tag, COUNT( * ) as ResultCount
FROM keywords CROSS JOIN ( /* search query */ ) as rslt
WHERE
/* provide the list of rules that will cause the system to eliminate bad row pairings */
GROUP BY Tag
ORDER BY ResultCount
此方法要求您首先在只有一列的简单表中定义首选搜索标签。CROSS JOIN 导致搜索结果在新表中一遍又一遍地重复。例如,考虑以下两个表,其中每个值表示一行有列(即 Result1 可能在音乐专辑搜索中包含 4 列 [“艺术家”、“专辑名称”、“发行年份”、“专辑 id”] 和Result2 将具有相同的数据结构:
关键词:
TagOne, TagTwo
SearchResults: Result1, Result2, Result3, Result4
CROSS JOIN 导致在系统的工作内存中产生以下内容:
CROSS JOIN TABLE:
TagOne, Result1
TagOne, Result2
TagOne, Result3
TagOne, Result4
TagTwo, Result1
TagTwo, Result2
TagTwo, Result3
TagTwo, Result4
然后 WHERE 子句告诉系统保留哪些行以及丢弃哪些行。这是您将搜索词与使用该搜索词时将找到的未来结果相匹配的地方。在这种情况下,我们假设搜索词“TagOne”会找到 Result1 和 Result4,但不会找到 Result2 和 Result3,而“TagTwo”会找到除 Result3 之外的所有搜索结果。
系统工作内存中的结果表现在如下所示:
CROSS JOIN TABLE AFTER WHERE CLAUSE:
TagOne, Result1
TagOne, Result4
TagTwo, Result1
TagTwo, Result2
TagTwo, Result4
count 和 group by 命令一起工作以将此表简化为以下内容:
CROSS JOIN TABLE AFTER COUNT:
TagOne, 2
TagTwo, 3
然后选择 ASC 或 DESC 会将这些搜索词排序为您认为搜索词最有用的顺序。我的预测是,这将比原始建议的 2+ 秒更快地产生结果。
原始答案
你的问题的答案是,“是的,这是可能的。” 使用 PHP 一次构造一个查询,然后使用 UNION 将它们连接到一个表达式中,然后再将它们发送到您的数据库。
SELECT 'searchtag' as Tag, COUNT( * ) as ResultCount
FROM /* current_search_results */ as rslt
WHERE /* filter_list_here */ GROUP BY Tag
UNION
SELECT 'searchtag2' as Tag, COUNT( * ) as ResultCount
FROM /* current_search_results */ as rslt
WHERE /* filter_list_here */ GROUP BY Tag
UNION
SELECT 'searchtag3' as Tag, COUNT( * ) as ResultCount
FROM /* current_search_results */ as rslt
WHERE /* filter_list_here */ GROUP BY Tag
将 /* current_search_results */ 替换为括号中的原始搜索 SQL 的副本()
或对存储在先前查询中的临时表的引用。就个人而言,我喜欢使用子查询格式()
只是因为当我不引用可能已被另一个执行相同查询的用户更改/覆盖的临时表时,我可以不用担心。
结果输出将是一个如下所示的表:
Tag / ResultCount
searchtag / 500
searchtag2 / 34
searchtag3 / 234
当然,您可以添加
SELECT * FROM (/*above_query_here*/) as unordered_results ORDER BY ResultCount
为了使结果按将产生最多记录/最少记录的搜索标签排序。在语句末尾使用ASC
或更改排序顺序。DESC
ORDER BY