gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:31:24 25 4
gpt4 key购买 nike

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

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

最佳答案

经过深思熟虑重新形成答案

原始答案可行,但正如您所指出的,它将多次运行原始搜索查询并消耗大量处理时间。另一种方法可以产生相同的结果,可能会更快并且更容易编码。 @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 子句告诉系统要保留哪些行以及要丢弃哪些行。您可以在此处将搜索词与使用该搜索词时将找到的 future 结果进行匹配。在本例中,我们假设搜索词“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

为了使结果按搜索标签排序,将产生最多记录/最少记录。在 ORDER BY 语句末尾使用 ASCDESC 来更改排序顺序。

关于php - 如何正确创建 SQL 查询以显示指定结果的每个细化条件中的产品数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16491446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com