根据用户完成的搜索统计搜索条件记录(MYSQL PHP)

时间:2012-02-21 07:33:11

标签: php mysql query-optimization

我有一个搜索表单,根据具体的可用日期提供特定国家/地区的假期搜索属性。搜索部分有2个部分“基本搜索”& “提前搜索”。

基本搜索包含国家/地区下拉列表和日期字段。提前搜索我们有多个过滤器,如“卧室”(1间卧室,2间卧室等),然后属性类型(公寓,别墅等)

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

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

在页面上运行多个查询将使其永久加载,并且由于多次查询加载而无法显示内容。有没有更好的&更快的方法吗?

请帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

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

最终虽然你的过滤选项很少

  • 属性类型:在单独的表中对此进行规范化
  • 卧室:将此存储为tinyint或smallint(无符号),无法想象有255间卧室以上的房产,绝对不超过65k
  • 位置:在一个单独的表中对此进行规范化,理想情况下采用树格式以确保关系被记录
  • 星级评分:可以存储为未签名的tinyint

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

在一天结束时,我使用一个非常大的内存表,一些构建WHERE和JOIN语句的逻辑,以及一个单独的查询来计算集合分组中的记录。这与用户假日搜索结果类似,因此数据被认为是完全短暂的。为了您的目的,可能会接受更小的内存表,但原则是相似的。

答案 1 :(得分:1)

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

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

然后运行查询

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

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

答案 2 :(得分:1)

您尝试实现的目标称为faceted search

这不适合像MySQL这样的关系型数据库。

您可以使用ElasticSearchAWS CloudSearch及其facet features

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