php – 具有多个选项的Mysql产品过滤器
发布时间:2020-12-13 17:25:36 所属栏目:PHP教程 来源:网络整理
导读:例如我有一个电视列表,每个电视都有一些属性,如:品牌(三星,索尼等..),尺寸(80厘米,116厘米等),SmartTv(是的,没有). 我有以下架构: CREATE TABLE `products` ( `id` int(11) NOT NULL auto_increment,`name` varchar(150) NOT NULL,)CREATE TABLE `attribut
例如我有一个电视列表,每个电视都有一些属性,如:品牌(三星,索尼等..),尺寸(80厘米,116厘米等),SmartTv(是的,没有).
我有以下架构: CREATE TABLE `products` ( `id` int(11) NOT NULL auto_increment,`name` varchar(150) NOT NULL,) CREATE TABLE `attributes` ( `id` int(11) NOT NULL auto_increment,`name` varchar(20) character set latin1 NOT NULL ) CREATE TABLE `attributes_entity` ( `product_id` int(11) NOT NULL,`attribute_id` int(11) NOT NULL,`value_id` int(11) NOT NULL,) CREATE TABLE `attributes_values` ( `id` int(11) NOT NULL auto_increment,`value` varchar(255) default NULL,) 如果我想要来自三星的所有电视,我会这样说: SELECT `p`.`id`,`p`.`name` FROM `attributes_entity` `ae` INNER JOIN `products` `p` ON `ae`.`product_id`=`p`.`id` INNER JOIN `attributes` `a` ON `ae`.`attribute_id`=`a`.`id` INNER JOIN `attributes_values` `av` ON `ae`.`value_id`=`av`.`id` WHERE (`a`.`name`='samsung' AND `av`.`value`='samsung') 这很棒,但如果我想要的话:所有三星电视都是smartTv: SELECT `p`.`id`,`p`.`name` FROM `attributes_entity` `ae` INNER JOIN `products` `p` ON `ae`.`product_id`=`p`.`id` INNER JOIN `attributes` `a` ON `ae`.`attribute_id`=`a`.`id` INNER JOIN `attributes_values` `av` ON `ae`.`value_id`=`av`.`id` WHERE (`a`.`name`='samsung' AND `av`.`value`='samsung') //imposible query and (`a`.`name`='smartv' AND `av`.`value`='yes') 我应该如何修复多个AND的查询? 解决方法
第一个想法,在我的脑海中 – 尝试用内部查询替换你的连接,并计算匹配属性的数量:
SELECT `p`.`id`,`p`.`name` FROM `products` `p` WHERE `p`.`id` IN (SELECT `ae`.`product_id` FROM `attributes_entity` `ae` INNER JOIN `attributes` `a` ON `ae`.`attribute_id`=`a`.`id` INNER JOIN `attributes_values` `av` ON `ae`.`value_id`=`av`.`id` WHERE ((`a`.`name`='samsung' AND `av`.`value`='samsung') OR (`a`.`name`='smartv' AND `av`.`value`='yes')) HAVING COUNT(*) >= 2 -- number of matching attributes required ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |