【问题标题】:How to implement data filtering in mysql EAV model如何在mysql EAV模型中实现数据过滤
【发布时间】:2015-09-15 09:11:48
【问题描述】:

我在 mysql 的 EAV 模型中创建了一个表,我最大的问题是如何像电子商务网站一样进行数据过滤让我展示一些数据以及我真正想要实现的目标

我有一个名为 value 的表,我有四列

id product_id  Attribute_name Attribute Value
1     1          Brand           Apple
2     1          Model           Iphone6
3     1          Color           White
4     1           OS             ios

5     2          Brand           Samsung
6     2          Model           Note4
7     2          Color           Black
8     2          OS              Android 

9     2          Brand           SONY
10    2          Model           Xperia
11    2          Color           Red
12    2          OS              Android 

我想创建所有 4 个过滤表假设有人检查苹果和三星然后只有两个模型必须出现 Iphone6 和 Note4 然后当用户检查 Iphone6 时只有白色和操作系统中的 ios 如何执行此操作请我非常想要解决方案 2 天

【问题讨论】:

  • 您是否愿意提供更多有关您正在寻找的信息的信息,因为我不知道到目前为止给出的答案是否对您有用?

标签: mysql sql database rdbms entity-attribute-value


【解决方案1】:

改变你的表结构,让BrandModelColorOS 是属性会让生活更轻松,但假设你不能转换它有充分的理由,我建议使用嵌套查询:

SELECT * FROM value WHERE product_id = (
     SELECT product_id
     FROM value
     WHERE Attribute_name = 'Brand'
     AND Attribute_value = 'Apple'
);

这将返回与 Apple 产品相关的所有信息。如果您想过滤该列表以便获得模型列表,请将条件附加到外部查询,例如:

SELECT * FROM value WHERE product_id = (
     SELECT product_id
     FROM value
     WHERE Attribute_name = 'Brand'
     AND Attribute_value = 'Apple'
)
AND Attribute_name = 'Model';

这里对 EAV 模型的优缺点进行了很好的分析: https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model#EAV_versus_row_modeling

如果你想拉多个匹配,你可以OR一起嵌套查询:

SELECT * FROM value WHERE product_id = (
     SELECT product_id
     FROM value
     WHERE Attribute_name = 'Brand'
     AND Attribute_value = 'Apple'
) OR product_id = (
     SELECT product_id
     FROM value
     WHERE Attribute_name = 'Brand'
     AND Attribute_value = 'Samsung'
)
AND Attribute_name = 'Model';

如果你想在多个级别拉多个匹配,你可以继续嵌套堆栈:

SELECT * FROM value WHERE product_id = (
     SELECT product_id
     FROM value
     WHERE Attribute_name = 'Brand'
     AND Attribute_value = 'Apple'
) OR product_id = (
     SELECT product_id
     FROM value
     WHERE Attribute_name = 'Brand'
     AND Attribute_value = 'Samsung'
)
AND Attribute_name = 'Model'
AND (Attribute_value = 'iPhone' OR Attribute_value = 'S3');

【讨论】:

  • 如果选中超过 1 个值该怎么办iphone6 有 ios os 白色。如何使用 EAV 模型进行多级过滤我希望你理解我的问题我想要像电子商务网站一样的过滤但是在 EAV 模型中
  • 我知道您希望它像一个电子商务网站,但很少有分面搜索(这是您逃避的功能)允许您在每个级别选择多个方面(例如 Apple 和三星、iPhone 和S3)。它们通常通过逐步限制您的搜索来工作,例如显示所有产品,然后按 Apple 过滤,显示 Apple 产品并修改下游过滤器以仅显示 Apple-product-options。
  • 您想说的是,当用户单击品牌复选框时,我必须创建模型选项,并且您要进一步说明的是操作系统选项
  • 我认为您的条款有点混乱,但基本上是的。每次点击一个复选框都代表一个过滤器的应用,它会影响数据集,但也会影响其他过滤器的列表。
猜你喜欢
  • 2015-04-15
  • 2016-08-24
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多