【问题标题】:Count search criteria record based on search done by user (MYSQL PHP)根据用户完成的搜索计算搜索条件记录(MYSQL PHP)
【发布时间】:2012-03-11 12:57:35
【问题描述】:

我有一个搜索表单,它根据特定国家/地区的可用性特定日期提供搜索属性。搜索部分有 2 个部分“基本搜索”和“高级搜索”。

基本搜索包含国家下拉列表和日期字段。预先搜索我们有多个酒店过滤器,例如“卧室”(1 间卧室、2 间卧室等),然后是物业类型(公寓、别墅等)

我想显示带有计数的搜索过滤器选项,例如“1 间卧室(23 处房产)”,其他搜索过滤器选项也是如此。

我正在使用 php/mysql 来创建这个应用程序,所以我首先想到的是对所有搜索过滤器运行多个查询,并从 mysql 获取 COUNT 结果并显示它。我的页面上有大约 10-12 个不同的过滤器。此外,我还必须根据选择的所有搜索选项(基本和高级)动态显示计数记录。

在页面上运行多个查询将使其永久加载,并且由于多次查询加载而不会显示内容。有没有更好更快的方法来做到这一点?

请帮忙,谢谢!

【问题讨论】:

  • 将结果缓存到平面表中是一个快速的解决方案
  • 但结果应该是动态的,我们不知道用户会应用什么过滤器...

标签: php mysql query-optimization


【解决方案1】:

我之前尝试过这样做,但根据您允许的过滤器数量和列出的酒店数量,它可能会变得非常慢,更不用说您如何处理重复的酒店了。

最终,尽管您将拥有很少的过滤器选项

  • 属性类型:在单独的表中对其进行规范化
  • Bedrooms :将其存储为 tinyint 或 smallint(未签名),无法想象有超过 255 间卧室的房产,而且绝对不会超过 65k
  • 位置:在单独的表格中对其进行规范化,最好采用树格式以确保记录关系
  • 星级:这可以存储为 tinyint 无符号

现在您的问题是,如果有人对 3 间卧室以上应用过滤器,您仍然应该获得 2 间卧室、1 间卧室的值,因为将过滤器改回该值会产生结果。

最后,我使用一个非常大的内存表、一些逻辑来构建 WHERE 和 JOIN 语句以及一个单独的查询来计算一组分组中的记录。这是为了类似于用户的假期搜索结果,因此数据被认为是完全瞬态的。出于您的目的,一个小得多的内存表可能是可以接受的,但是原理是相似的。

【讨论】:

  • +1 因为这是唯一可以为可行的解决方案(不是外部服务)提供一些见解并考虑性能的答案 - 现在我自己正在经历这个并且已经决定它必须使用某种如果我不想减慢实际搜索结果的速度,请缓存表 - 来到这里希望得到更简单的东西:(
【解决方案2】:

在 SELECT 语句中将 GROUP BY 子句与 COUNT 结合使用。比如我定义了一个小测试表比如

create table rooms (
rooms INT NOT NULL,
name VARCHAR(10)
)

然后运行查询

SELECT rooms,COUNT(*) FROM rooms GROUP BY rooms;

这会为您提供每个房间计数的结果以及具有该值的条目数。

【讨论】:

    【解决方案3】:

    您想要实现的目标称为faceted search

    这不是一个适合 MySQL 等关系型数据库的问题。

    您可以使用ElasticSearchAWS CloudSearch 及其facet features

    请记住,这些是搜索服务器,不会替换您的主数据库。它们只执行返回与存储在数据库中的实际记录相对应的 ID 的搜索操作。您仍然需要 MySQL(或 MongoDB 等)。

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多