我正在使用这个查询下面它花了很多时间在5分钟左右..它疯了..还有更好的方法吗?或者说因为这么长时间..甚至将它切割成较小的查询n得到值n然后找到共同的值比这快得多。
SELECT Product_ItemID
FROM Product_ItemProperties
LEFT JOIN Product_Items USING (Product_ItemID)
WHERE
Product_CatalogueID = 'xx' AND
Field = 'brandname' AND
MATCH (Value) AGAINST ('xx' IN BOOLEAN MODE) AND
Product_ItemID IN (Select Product_ItemID
FROM Product_ItemProperties
Where Field = 'xx' AND
Match (Value) AGAINST ('xx' IN BOOLEAN MODE)
);
答案 0 :(得分:0)
我不知道为什么在你正在制作Field = 'brandname'
的第一个where子句和在Field = 'xx'
过滤的第二个内部where子句中。无论如何,当你应该使用它时,你会双重选择Product_ItemProperties
。
试试这个:
SELECT
Product_ItemID
FROM
Product_ItemProperties
LEFT JOIN
Product_Items USING (Product_ItemID)
WHERE
Product_CatalogueID = 'xx'
AND Field = 'brandname'
AND MATCH (Value) AGAINST ('xx' IN BOOLEAN MODE)
AND Field = 'xx';
答案 1 :(得分:0)
看起来你的itemProperties表有相同“Product_ItemID”的多个条目,你正在寻找既是“BrandX”又有一些不同值的“OtherProperty”的东西。要处理这个问题,您可以使用该表TWICE(如果您感兴趣的更多属性值,则可以使用更多...我建议您在Product_ItemProperties表上使用(Product_ItemID,Field,Value)索引,以便最好地优化查询。
例如,您正在寻找汽车品牌“X”,其次,它是一辆“蓝色”汽车(不考虑目录组件)。
此外,请注意,在此查询中,我给出了简化的别名,并使用alias.field限定每个字段,因此没有歧义哪个字段来自哪里。
外部WHERE子句是您的第一个标准,只获取具有最少品牌名称字段的那些项目,并且它与您期望的值匹配...从这些项目再次加入产品项目属性表,但是对于您感兴趣的“其他”字段值及其值。
我不确定cataglog组件在哪里,但我怀疑这是来自产品表,应该调整IT别名。
SELECT
ByBrand.Product_ItemID,
P.NameOfProduct, (just an example to get this too)
FROM
Product_ItemProperties ByBrand
JOIN Product_Items P
ON ByBrand.Product_ItemID = P.Product_ItemID
JOIN Product_ItemProperties ByOtherField
ON ByBrand.Product_ItemID = ByOtherField.Product_ItemID
AND ByOtherField.Field = 'otherPropertyInterestedIn'
AND MATCH (ByOtherField.Value) against ( 'otherValueLookingFor' IN BOOLEAN MODE )
WHERE
ByBrand.Product_CatalogueID = 'someCatalogID' (or is this from product_items table)
AND ByBrand.Field = 'brandname'
AND MATCH (ByBrand.Value) against ( 'brandValueLookingFor' IN BOOLEAN MODE )