只是“有效”的简单解决方案可能是:
SELECT *
FROM products
JOIN colors ON colors.id = products.color_id
WHERE
( title = "red" AND color = "dress" ) OR
( color = "red" AND title = "dress" )
如果优化器足够愚蠢,不能自行注意,这种情况可能会更好:
WHERE
( title = "red" OR title = "dress") AND
( color = "red" OR color = "dress")
如果您为问题添加了更多属性(除了“标题”和“颜色”),如果存储不是问题,您可能希望将所有文本属性合并(和复制)到单个VARCHAR列中,并运行全文搜索此列.
CREATE TABLE products_properties (
product_id INT NOT NULL PRIMARY KEY,
properties VARCHAR (255),
FOREIGN KEY fk_product (product_id) REFERENCES products(id),
FULLTEXT ftx_properties (properties)
);
搜索变得非常简单:
SELECT products.*, colors.*
FROM products
JOIN colors ON colors.id = products.color_id
JOIN products_properties AS pp ON pp.product_id = products.id
WHERE MATCH(properties) AGAINST ("+red +dress")
在这个特定的例子中,这显然没有任何意义,但是属性越多,它就越能加速查询.这种非规范化也是以维护products_properties表的复杂性增加为代价的.
如果你现在问题变得非常毛茸茸
>必须处理较少的标准化输入,如“红蓝”
>拥有属于这两个类别的单词(例如,如果“红色”也是有效的布料标题)并且仍然想要区分它们(例如,像“红色蓝色”这样的查询返回一个名为“红色”的布料,颜色为“蓝色” )
但看起来这超出了你的问题的范围.