php - CakePHP 2.0 - 从某个结果集中获取具有特定参数的结果计数

标签 php cakephp

我正在使用 CakePHP 2.0 开发一个搜索引擎,但很难找到最有效的方法来获得我想要的结果。

假设我正在查询人员,我得到一组 20 个结果,其中 5 个年龄为 20 岁,10 个结果为 30 岁,5 个结果为 40 岁。此外,其中 15 人的眼睛是棕色的,3 人是蓝色的,2 人是绿色的。我想找到获得这些具体计数的最有效方法。然后,我将在页面上显示这些结果,以便用户可以使用这些参数查看结果中的内容。然后,他们将能够单击其中之一将该搜索参数添加到当前查询中。

这根本不是我可以存储在数据库或缓存中的东西,因为每次搜索可能不同,并且可能/将返回不同的结果。

如果我没有解释我想要做什么(这可能是可能的),那么有几个网站可以做到这一点。 Cars.com 在搜索汽车时使用此方法。您可以进行一般搜索,然后侧面的链接可以让您缩小结果范围。这些链接包括属于特定参数的当前结果集的计数。

一个想法是获取完整的结果集,然后解析它生成计数,这会起作用,但在我的特定项目中,我正在处理数千条记录,似乎这可能会增加额外的加载时间服务器上的页面和/或压力。

这是一个直观的示例: visual example of the question/result I'm trying to achieve

最佳答案

Cars.com 可能会为每个被统计的功能使用关联的标签。通过关联标签,表记录有多个并且属于多个特征标签。

这样他们就不必为每辆车的价格创建标签。他们创建价格范围标签。

对于每条汽车记录,都有关联的标签记录,其中包含该汽车的所有功能。然后,您可以在标签记录中缓存有多少辆汽车具有该功能的计数。

SQL表结构可能是这样的。

 CREATE TABLE `cars` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `make` varchar(45) DEFAULT NULL,
   `model` varchar(45) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 CREATE TABLE `features` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `name` varchar(45) DEFAULT NULL,
   `count` int(11) NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 CREATE TABLE `cars_features` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `car_id` int(11) NOT NULL,
   `feature_id` int(11) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

对于每个汽车记录,可以有多个功能记录。这些通过 cars_features 表与每辆汽车相关联。当有人搜索并找到汽车 XXXX 时,您可以查找该汽车的功能,还可以显示具有该功能的汽车的缓存计数。

编辑:

缩小计数范围,使其仅限于搜索中发现的汽车。您需要首先获取所有汽车 ID 的列表,然后使用 cars_features 表和功能之间的 JOIN 执行 COUNT。

这是一些示例数据。

  INSERT INTO `cars` (`make`, `model`) VALUES ('Ford', 'Explorer');
  INSERT INTO `cars` (`make`, `model`) VALUES ('Hond', 'Civic');
  INSERT INTO `cars` (`make`, `model`) VALUES ('Hond', 'Civic');

  INSERT INTO `features` (`name`, `count`) VALUES ('Red', 2);
  INSERT INTO `features` (`name`, `count`) VALUES ('Green', 1);

  INSERT INTO `cars_features` (`car_id`, `feature_id`) VALUES (1, 1);
  INSERT INTO `cars_features` (`car_id`, `feature_id`) VALUES (2, 1);
  INSERT INTO `cars_features` (`car_id`, `feature_id`) VALUES (3, 2);

假设我们搜索返回两项,因此我们的汽车 ID 为 (1,2)。我们可以使用以下 SQL 查询找到特征计数。

 SELECT `features`.`id`,COUNT(`features`.`id`)
     FROM `cars_features` 
     JOIN `features` ON (`cars_features`.`feature_id`=`features`.`id`)
     WHERE `cars_features`.`car_id` IN (1,2)
     GROUP BY `features`.`id`

这将报告每个功能的计数,仅限于找到的汽车记录。

我将尝试以 CakePHP 模型格式编写以上内容。

 $this->CarFeature->find('all',array(
    'conditions'=>array('CarFeature.car_id'=>$ids),
    'fields'=>array('Feature.id','COUNT(Feature.id)'),
    'group'=>array('Feature.id'),
    'contain'=>'Feature'
 ));

关于php - CakePHP 2.0 - 从某个结果集中获取具有特定参数的结果计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327598/

相关文章:

php - CakePHP 中的变量前缀路由

mysql - cakephp3 中的递归?

php - 创建包含所有可能变体的产品数组

php - 从 Trello 身份验证中获取 "App not found"

php - Yii ActiveRecord : select only first row with the same value

php - php 函数外的全局关键字

php - SocketException 权限被拒绝 - CakePHP 2.3

php - 如何获取二维数组中的索引行和列

php - .htaccess 301 重定向不起作用?

php - CakePHP 3.1 patchEntity 在清洁时总是将 belongsToMany 关联标记为脏