如何正确创建SQL查询以显示指定结果的每个细化条件中的产品数量

时间:2013-05-10 22:06:42

标签: php mysql product

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

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

2 个答案:

答案 0 :(得分:1)

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

SQL-Fiddle Demo

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

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

答案 1 :(得分: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来更改排序顺序。