搜索具有来自相同列的多个WHERE子句的函数

时间:2014-07-21 08:07:27

标签: php sql prestashop-1.6

我正在开发的搜索功能存在轻微问题,我需要你的帮助。

总而言之,有一个向用户显示的产品清单;点击不同的标准后,用户可以减小此列表的大小,找到合适的产品。

搜索条件示例:

enter image description here

例如,它将获得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的同一列下:

enter image description here

到目前为止,这是我的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的可能性,但由于ANDOR组合,我无法使其正常工作。

你可以帮我一点吗?

如果您需要其他信息,请与我们联系。

非常感谢!

1 个答案:

答案 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
)