EAV (このトピックでは PRODUCT - OPTION -VALUE と呼ばれる ENTITY - MODEL -VALUE) モデルに基づいて、オンライン ショップ用のファセット フィルターを構築しています。次のロジックを使用して製品をフィルタリングします。
... pv.value_id IN (option_value1 or option_value1) AND pv.value_id IN (option_value2 or option_value2)
このように実現されたクエリでは (FIND_IN_SET なしで多くのクエリを提供します):
$pids=配列();
foreach ($option as $values) {
$sqli = "SELECT product_id FROM product_to_value WHERE value_id in ('" . implode(",", $values) . "') ";
$query =$db->query($sqli);foreach ($query->rows as $row){ $pids[] = $row['product_id']; } }
$sql .= " AND p.product_id IN (" . implode(",", $pids) . ")";
別のタスクは、依存関係を考慮してオプション値の製品をカウントするためのソリューションです (たとえば、以下のクエリは、既存のフィルタリングが与えられたすべての可能な製品を選択します。10 - オプション 1 の値であり、6,8 - オプション 2 の値です)。
SELECT p.product_id, pv.value_id, GROUP_CONCAT(pv.value_id) as value_ids FROM
product
p INNER JOIN product_to_value pv ON (p.product_id = pv.product_id) WHERE pv.value_id<>0 GROUP BY product_id HAVING ( FIND_IN_SET( 10, value_ids ) >0 ) AND ( FIND_IN_SET( 6, value_ids ) >0 OR FIND_IN_SET( 8, value_ids ) >0 )
その後、選択した製品の値のカウントを取得します。
質問:これは完全な解決策ではないようです。フィルター オプションを考慮して製品をカウント/フィルター処理するためにこのコードを改善する方法を教えてください。FIND_IN_SET を使用またはメモする
理解を深めるための SQL スキーマ:
CREATE TABLE `option` (
`option_id` int(10) NOT NULL auto_increment,
`status` int(1) default '0',
`sort_order` int(10) default '0',
PRIMARY KEY (`option_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `option_value` (
`value_id` int(10) NOT NULL auto_increment,
`name` varchar(127) NOT NULL,
`option_id` int(10) default '0',
PRIMARY KEY (`value_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `product_to_value` (
`product_id` int(11) NOT NULL,
`value_id` int(11) NOT NULL,
`option_id` int(11) NOT NULL,
PRIMARY KEY (`product_id`,`value_id`,`option_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `product` (
`product_id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
アップデート:
FIND_IN_SET のない追加のバリアント。
SELECT product_id FROM product_to_value WHERE product_id IN (SELECT product_id FROM product_to_value WHERE value_id IN (6,8) GROUP BY product_id) AND product_id IN (SELECT product_id FROM product_to_value WHERE value_id IN (10) GROUP BY product_id ) GROUP BY product_id
どちらのバリアントが優れているか、または異なるソリューションですか?