我正在开发的搜索功能存在轻微问题,我需要你的帮助。
总而言之,有一个向用户显示的产品清单;点击不同的标准后,用户可以减小此列表的大小,找到合适的产品。
搜索条件示例:
例如,它将获得222类的所有产品。然后,如果用户点击颜色" D",它将仅显示颜色为" D"的产品。如果用户添加了颜色" E",它将显示带有任何一种颜色的产品。
非常重要的是,如果用户点击颜色" D",颜色" E"然后是清晰度" FL"和清晰度" IF&#34 ;;它必须显示带((color = D OR color = E) AND (clarity = FL OR clarity = IF))
的产品。
但是,数据库的结构不是这样的,所有不同的选项(颜色D,颜色E,颜色E,清晰度FL,清晰度IF ......)都在名为id_feature_value的同一列下:
到目前为止,这是我的sql请求(为了便于阅读而简化):
$sql = 'SELECT p.*
FROM `'._DB_PREFIX_.'product` p
LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)
LEFT JOIN `'._DB_PREFIX_.'feature_product` f ON (f.`id_product` = p.`id_product`)
WHERE c.`id_category` = 222 '.$searchValues.
' GROUP BY f.`id_product` ORDER BY p.`id_product` DESC LIMIT '.$scroll.',20';
$searchValues
变量对应于上面解释的内容 - 不幸的是 - 显然 - 不起作用。
$scroll
变量对应于用户的滚动级别。此功能收集20个第一项,当用户到达底部时,将带来20个下一个条目。
我查看了IN
的可能性,但由于AND
和OR
组合,我无法使其正常工作。
你可以帮我一点吗?
如果您需要其他信息,请与我们联系。
非常感谢!
答案 0 :(得分:0)
您可以将条件置于HAVING COUNT
之内。例如,假设id_feature = 20
表示颜色,值1142,1143
表示不同的颜色。然后,下面的查询将计算每种产品中这两种颜色中有多少种,并且仅返回具有1种或更多种颜色的颜色。您可以根据需要添加尽可能多的AND COUNT(CASE ...
条件。
GROUP BY f.`id_product`
HAVING
COUNT(CASE
WHEN id_feature = 20
AND id_feature_value IN (1142,1143)
THEN 1
END) > 0
AND COUNT(CASE
WHEN id_feature = 23
AND id_feature_value IN (233,234)
THEN 1
END) > 0
修改强>
另一种可能更快的方法是使用EXISTS
即
SELECT p.* FROM product p
WHERE EXISTS (
SELECT 1 FROM feature_product
WHERE id_feature = 20
AND id_feature_value IN (1142,1143)
AND id_product = p.id
) AND EXISTS (
SELECT 1 FROM feature_product
WHERE id_feature = 23
AND id_feature_value IN (233,234)
AND id_product = p.id
)