0

我正在构建一个页面,用于在产品表中显示指定搜索的结果。我想要实现的是显示一个“过滤器小部件”,以允许用户细化他们的搜索。在这个小部件中,我想显示一组可用选项,以及这些选项中的结果数量。因此,如果用户选择将搜索细化到每个标准,他们将有效地看到他们将获得多少结果。这将需要在原始搜索结果中进行搜索。可以在此处查看一个示例,其中“过滤您的结果”侧栏,显示一组精炼搜索以及括号中的属性数量。

我想知道是否有任何适当的方法来处理这个问题,并在原始 SQL 查询中获取精炼搜索的数量,而不是为每个精炼条件创建单独的查询。

4

2 回答 2

1

重新思考后重新形成的答案

原始答案将起作用,但正如您所指出的,它将多次运行原始搜索查询并消耗大量时间来处理。产生相同结果的替代方法可能更快、更容易编码。@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或更改排序顺序。DESCORDER BY

于 2013-05-10T22:48:02.657 回答
1

我认为您可以使用COUNT(*)or COUNT(kywds),就像这样:

SQL-Fiddle 演示

   SELECT kywds, COUNT(kywds) AS `Results`
     FROM keywords
 GROUP BY kywds
 ORDER BY COUNT(kywds)

其中 kywds 是包含精炼过滤器关键字的列

于 2013-05-10T22:33:18.453 回答