存储具有可筛选属性的项的正确方法是什么



我最近遇到了一些SQL逻辑的问题:MySQL的多个WHERE AND/OR条件逻辑,并意识到这很可能是我构建数据的方式。我在屏幕上摸索着最好的方法是什么。

有一个产品列表,它们是汽车。

这些车有属性,它们不是强制性的,有些车可能比其他车更多:颜色、尺寸、车轮

然后,这些属性具有,颜色:红色、绿色、黄色、蓝色。尺寸:小、中、大。车轮:2、4、6。

我想找到匹配所有属性的汽车的结果,这些属性被选择为任意值,例如:

  1. 所有为(红色或蓝色(和2个轮子的小型汽车
  2. 所有为(红色、蓝色或黄色(和(小型或中型(的车辆
  3. 所有小型AND(2个车轮或4个车轮或6个车轮(

之前,我将这些结果存储在一个表中,其中有一个产品ID、一个属性ID和一个值ID,每个变体对应一行。问题是,正如我前面提到的另一个线程一样,我不能用AND查询它,因为它返回false。例如,我无法在表中搜索红色和蓝色的行。它一定是其中之一。这很好,但无论我试图选择什么,它都会显示其他所有结果,因为它会从OR语句中反弹。

我想把这些数据存储在数组/分隔符分隔的值中?我只是想让它易于查询。

我喜欢将聚合与条件聚合一起使用。例如,对于您的第一个子弹:

select a.carid
from attributes a
group by a.carid
having sum( (attribute, value) in ( ('color', 'red'), ('color', 'blue') ) ) > 0 and 
sum( (attribute, value) in ( ('wheels', '2') ) > 0;

> 0表示存在属性/值组合。使用= 0指定它不起作用。

相关内容

最新更新