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テーブルを介して各Carに関連付けられています。誰かがCarXXXXを検索して見つけたら、その車の機能を検索し、その機能を備えた車の数のキャッシュカウントを表示することもできます。
編集:
検索で発見された車のみに限定されるようにカウントを絞り込みます。最初にすべての車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);
それを検索すると、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'
));