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;
对于每个 Car 记录,可以有多个 Feature 记录。这些通过 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'
));