2012-07-16 100 views
3

我目前正在建立一个汽车经销商的网站。我希望允许用户细化类似于亚马逊或eBay的搜索结果。通过点击来缩小结果的能力会很好。问题是我这样做的方式,现在有许多不同的查询需要用COUNT总共完成。PHP MYSQL精简搜索多个查询

因此,要缩小的主要方式的结果是:

  • 车辆类型
  • 价格范围
  • 全新/二手

目前我我每次加载这个页面时都会做5个查询来获得结果的数量同时传入设定值。

查询1:

SELECT vehicle_type, COUNT(*) AS total FROM inventory 
[[ Already Selected Search Parameters]] 
GROUP BY vehicle_type 
ORDER BY vehicle_type ASC 

查询2:

SELECT make, COUNT(*) AS total FROM inventory 
[[ Already Selected Search Parameters]] 
GROUP BY make 
ORDER BY make ASC 

查询3,4,5 ......

有没有办法在一个查询中这样做吗?速度更快吗?

回答

2

您的询问似乎很合理。

你可以做到这一点,使用UNION ALL一个查询:

SELECT 'vehicle_type' AS query_type, vehicle_type, COUNT(*) AS total 
FROM inventory 
... 
GROUP BY vehicle_type 

UNION ALL 

SELECT 'make', make, COUNT(*) AS total FROM inventory ... GROUP BY make 

UNION ALL 

SELECT ... etc ... 

这样做的性能优势也不会很大。

如果您发现您正在解决这些查询并且结果不会经常更改,那么您可能需要考虑缓存结果。考虑使用类似memcache的东西。

+0

我打算看看memcache,我一直想看看它很长一段时间。经销商做了一些大的促销活动,并且一次有数百人成千上万的人上网。只是想确保它最初是正确构建的 – hippobebo 2012-07-16 22:49:43

1

有几种方法可以根据数据仓库对数据进行排名,但您试图在搜索词中完成的任务称为方面。一个真正的搜索引擎(将与您提到的网站一起使用)执行此操作。

许多网站利用Lucene(基于Java的)与SOLR搜索引擎来完成你指的是什么。有一个名为ElasticSearch的新解决方案,它具有RESTful API并提供方面,但您需要安装Java,ES,然后可以调用返回本机JSON的搜索引擎。

做这在MySQL不需要这么多的加入可能需要额外的表,或许触发并获得复杂。如果汽车经销商不期望Cars.com的流量(百万/天),然后你可能会试图在实际需要之前优化一些东西。您的递归查询可能速度够快,并且您没有报告存在实际问题或瓶颈。