加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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
                    );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读